Просто обратный доступ
Лучше всего использовать 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
Вы не можете вызвать advancedBya, 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:))