Просто обратный доступ
Лучше всего использовать substringToIndex
вместе endIndex
свойство и advance
глобальную функцию.
var string1 = "www.stackoverflow.com"
var index1 = advance(string1.endIndex, -4)
var substring1 = string1.substringToIndex(index1)
Ищу строку, начинающуюся сзади
Использование rangeOfString
и набор options
для.BackwardsSearch
var string2 = "www.stackoverflow.com"
var index2 = string2.rangeOfString(".", options: .BackwardsSearch)?.startIndex
var substring2 = string2.substringToIndex(index2!)
Никаких расширений, чистый идиоматический Swift
Swift 2.0
advance
теперь является частью Index
и называется advancedBy
. Вам это нравится:
var string1 = "www.stackoverflow.com"
var index1 = string1.endIndex.advancedBy(-4)
var substring1 = string1.substringToIndex(index1)
Swift 3.0
Вы не можете вызвать advancedBy
a, String
потому что у него есть элементы переменного размера. Вы должны использовать index(_, offsetBy:)
.
var string1 = "www.stackoverflow.com"
var index1 = string1.index(string1.endIndex, offsetBy: -4)
var substring1 = string1.substring(to: index1)
Много чего переименовали. Кейсы написаны в camelCase, startIndex
стал lowerBound
.
var string2 = "www.stackoverflow.com"
var index2 = string2.range(of: ".", options: .backwards)?.lowerBound
var substring2 = string2.substring(to: index2!)
Кроме того, я бы не рекомендовал принудительное разворачивание index2
. Вы можете использовать необязательную привязку или map
. Лично я предпочитаю использовать map
:
var substring3 = index2.map(string2.substring(to:))
Swift 4
Версия Swift 3 все еще действует, но теперь вы можете использовать индексы с диапазонами индексов:
let string1 = "www.stackoverflow.com"
let index1 = string1.index(string1.endIndex, offsetBy: -4)
let substring1 = string1[..<index1]
Второй подход остается неизменным:
let string2 = "www.stackoverflow.com"
let index2 = string2.range(of: ".", options: .backwards)?.lowerBound
let substring3 = index2.map(string2.substring(to:))
string1.endIndex.advancedBy(-4)
меня работает Swift 2.0 вместоadvance
NSString
явно плохая, потому что в конечном итоге мы все хотим уйти от классов Foundation (устаревших). Так что .... больше разглагольствования!string1[..<index1]
. Нет необходимости вstring1.startIndex
.Swift 3, XCode 8
Поскольку метод
advancedBy(Int)
использования Swift 3 отсутствует . Посмотрите это расширение с подстрокой и друзьями:String
index(String.Index, Int)
String
ОБНОВЛЕНО расширение для Swift 4
Использование:
PS Действительно странно, что разработчики вынуждены заниматься
String.Index
вместо простогоInt
. Почему мы должны беспокоиться о внутреннейString
механике, а не просто о простыхsubstring()
методах?источник
encodedOffset
этот комментарий и правильный способ сделать это stackoverflow.com/questions/34540185/…Я бы сделал это с помощью индекса (
s[start..<end]
):Свифт 3, 4, 5
источник
редактировать / обновление:
В Swift 4 или новее (Xcode 10.0+) вы можете использовать новый метод BidirectionalCollection lastIndex (of :)
источник
Вот как я это делаю. Вы можете сделать это так же или использовать этот код для идей.
Вот расширения, которые я использую:
Кредит albertbori / Common Swift String Extensions
Как правило, я убежденный сторонник расширений, особенно для таких нужд, как манипуляции со строками, поиск и нарезка.
источник
String
имеет встроенную функцию подстроки:Если вы хотите «перейти к первому индексу символа», вы можете получить подстроку с помощью встроенной
find()
функции:Чтобы найти последний индекс, мы можем реализовать
findLast()
.ДОБАВЛЕНО:
Может быть,
BidirectionalIndexType
специализированная версияfindLast
быстрее:источник
Вы можете использовать эти расширения:
Swift 2.3
Swift 3
Использование:
источник
Swift 4:
вы можете проверить это следующим образом:
Проверьте библиотеку https://gitlab.com/seriyvolk83/SwiftEx . Он содержит эти и другие полезные методы.
источник
Вы хотите получить подстроку строки от начального индекса до последнего индекса одного из ее символов? Если да, вы можете выбрать один из следующих методов Swift 2.0+.
Методы, требующие
Foundation
Получить подстроку, включающую последний индекс символа:
Получить подстроку, НЕ включающую последний индекс символа:
Если вам нужно повторить эти операции, расширение
String
может быть хорошим решением:Методы, которые НЕ требуют
Foundation
Получить подстроку, включающую последний индекс символа:
Получить подстроку, НЕ включающую последний индекс символа:
Если вам нужно повторить эти операции, расширение
String
может быть хорошим решением:источник
Вот простой и короткий способ получить подстроку, если вы знаете индекс:
Это не приведет к сбою приложения, если ваш индекс превышает длину строки:
Оба примера готовы к Swift 3 .
источник
Единственное, что добавляет грохота, - это повторение
stringVar
:stringVar [ stringVar .index ( stringVar .startIndex, offsetBy: ...)
В Swift 4
Расширение может частично уменьшить это:
Затем использование:
Следует отметить, что
to
иfrom
есть типаSubstring
(илиString.SubSequance
). Они не выделяют новые строки и более эффективны для обработки.Чтобы вернуть
String
тип, егоSubstring
нужно вернуть вString
:Вот где наконец распределяется строка.
источник
источник
Swift 3
Хорошая статья для понимания, зачем нам это
источник
Я расширил String двумя методами подстроки. Вы можете вызвать подстроку с диапазоном от / до или от / длины следующим образом:
источник
Swift 2.0 Приведенный ниже код протестирован на XCode 7.2. См. Приложенный снимок экрана внизу
источник
В Swift 5
Нам нужно
String.Index
вместо простого значения Int для представления индекса.Также помните, что когда мы пытаемся получить подстроку из Swift
String
(тип значения), нам фактически приходится выполнять итерацию сSequence
протоколом, который возвращаетString.SubSequence
тип вместоString
типа.Чтобы вернуться
String
изString.SubSequence
, использованияString(subString)
Пример как ниже:
источник
Для Swift 2.0 это так:
источник
Я изменил сообщение Эндрюза, чтобы сделать его совместимым со Swift 2.0 (и, возможно, Swift 3.0). По моему скромному мнению, это расширение проще для понимания и похоже на то, что доступно на других языках (например, PHP).
источник
Я также создаю простое расширение String для Swift 4:
Так что вы можете легко назвать это так:
источник
Попробуйте это
Int-based
обходное решение:Примечание: это просто практика. Он не проверяет границу. Измените в соответствии со своими потребностями.
источник
Вот простой способ получить подстроку в Swift
источник