Как вы используете String.substringWithRange? (или как работает Ranges в Swift?)
Я еще не смог выяснить, как получить подстроку String
в Свифте:
var str = “Hello, playground”
func test(str: String) -> String {
return str.substringWithRange( /* What goes here? */ )
}
test (str)
Я не могу создать диапазон в Swift. Автозаполнение на игровой площадке не очень полезно - вот что он предлагает:
return str.substringWithRange(aRange: Range<String.Index>)
В стандартной справочной библиотеке Swift я не нашел ничего, что могло бы помочь. Вот еще одна дикая догадка:
return str.substringWithRange(Range(0, 1))
И это:
let r:Range<String.Index> = Range<String.Index>(start: 0, end: 2)
return str.substringWithRange(r)
Я видел другие ответы ( Поиск индекса символа в Swift String), которые, кажется, предполагают, что с String
тип моста для NSString
"старые" методы должны работать, но неясно, как - например, это тоже не работает (не похоже на правильный синтаксис):
let x = str.substringWithRange(NSMakeRange(0, 3))
Мысли?
33 ответа
Swift 3.X+, Xcode 8.X + Проверенное рабочее простое решение;
Использовать просто;
let myString = "12.12.2017 12:34:45"
let newString = myString?[(myString?.startIndex)!..<(myString?.index((myString?.startIndex)!, offsetBy: 10))!]
print(newString)
Выход = 12.12.2017
Для настройки легко изменить;
offsetBy: 10 // Change 10 to endIndex.
Когда вы меняете offsetBy: от 10 до 15,20 и т. Д., Вы обрежете вашу строку.
Спасибо!
Swift 3.0
Я решил немного повеселиться с этим и сделать расширение на String
, Возможно, я не правильно использую слово "усекать" в том, что у меня есть функция.
extension String {
func truncate(from initialSpot: Int, withLengthOf endSpot: Int) -> String? {
guard endSpot > initialSpot else { return nil }
guard endSpot + initialSpot <= self.characters.count else { return nil }
let truncated = String(self.characters.dropFirst(initialSpot))
let lastIndex = truncated.index(truncated.startIndex, offsetBy: endSpot)
return truncated.substring(to: lastIndex)
}
}
let favGameOfThronesSong = "Light of the Seven"
let word = favGameOfThronesSong.truncate(from: 1, withLengthOf: 4)
// "ight"
Было много хороших примеров того, как можно решить эту проблему. Первоначальный вопрос был об использовании substringWithRange, но, как было указано, это более трудный путь, чем просто создание собственного расширения.
Вышеупомянутое решение диапазона хорошо. Вы также можете сделать это дюжиной других способов. Вот еще один пример того, как вы могли бы сделать это:
extension String{
func sub(start: Int, length: Int) -> String {
assert(start >= 0, "Cannot extract from a negative starting index")
assert(length >= 0, "Cannot extract a negative length string")
assert(start <= countElements(self) - 1, "cannot start beyond the end")
assert(start + length <= countElements(self), "substring goes past the end of the original")
var a = self.substringFromIndex(start)
var b = a.substringToIndex(length)
return b
}
}
var s = "apple12345"
println(s.sub(6, length: 4))
// prints "2345"