Apenas acessando para trás
A melhor maneira é usar substringToIndexcombinado com a endIndexpropriedade e a advancefunção global.
var string1 = "www.stackoverflow.com"
var index1 = advance(string1.endIndex, -4)
var substring1 = string1.substringToIndex(index1)
Procurando um barbante começando pelas costas
Use rangeOfStringe defina optionspara.BackwardsSearch
var string2 = "www.stackoverflow.com"
var index2 = string2.rangeOfString(".", options: .BackwardsSearch)?.startIndex
var substring2 = string2.substringToIndex(index2!)
Sem extensões, Swift idiomático puro
Swift 2.0
advanceagora faz parte de Indexe é chamado advancedBy. Você faz como:
var string1 = "www.stackoverflow.com"
var index1 = string1.endIndex.advancedBy(-4)
var substring1 = string1.substringToIndex(index1)
Swift 3.0
Você não pode chamar advancedByum Stringporque tem elementos de tamanho variável. Você tem que usar index(_, offsetBy:).
var string1 = "www.stackoverflow.com"
var index1 = string1.index(string1.endIndex, offsetBy: -4)
var substring1 = string1.substring(to: index1)
Muitas coisas foram renomeadas. Os casos são escritos em camelCase, startIndextornou-se lowerBound.
var string2 = "www.stackoverflow.com"
var index2 = string2.range(of: ".", options: .backwards)?.lowerBound
var substring2 = string2.substring(to: index2!)
Além disso, eu não recomendaria o desembrulhamento forçado index2. Você pode usar ligação opcional ou map. Pessoalmente, prefiro usar map:
var substring3 = index2.map(string2.substring(to:))
Swift 4
A versão do Swift 3 ainda é válida, mas agora você pode usar subscritos com intervalos de índices:
let string1 = "www.stackoverflow.com"
let index1 = string1.index(string1.endIndex, offsetBy: -4)
let substring1 = string1[..<index1]
A segunda abordagem permanece inalterada:
let string2 = "www.stackoverflow.com"
let index2 = string2.range(of: ".", options: .backwards)?.lowerBound
let substring3 = index2.map(string2.substring(to:))