Apenas acessando para trás
A melhor maneira é usar substringToIndex
combinado com a endIndex
propriedade e a advance
funçã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 rangeOfString
e defina options
para.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
advance
agora faz parte de Index
e é 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 advancedBy
um String
porque 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, startIndex
tornou-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:))
string1.endIndex.advancedBy(-4)
está funcionando para mim em vez deadvance
NSString
é obviamente ruim, porque eventualmente todos nós queremos nos afastar das classes Foundation (legado). Então .... mais reclamação!string1[..<index1]
. Não há necessidadestring1.startIndex
.Swift 3, XCode 8
Desde que
advancedBy(Int)
se foi desdeString
o método de uso do Swift 3index(String.Index, Int)
. Confira estaString
extensão com substring e amigos:Extensão ATUALIZADA para Swift 4
Uso:
PS É realmente estranho que os desenvolvedores sejam forçados a lidar em
String.Index
vez de simplesInt
. Por que devemos nos preocupar com aString
mecânica interna e não apenas tersubstring()
métodos simples ?fonte
encodedOffset
verificar este comentário e a maneira correta de realizar esse stackoverflow.com/questions/34540185/…Eu faria isso usando um subscrito (
s[start..<end]
):Swift 3, 4, 5
fonte
editar / atualizar:
No Swift 4 ou posterior (Xcode 10.0+), você pode usar o novo método BidirectionalCollection lastIndex (of :)
fonte
É assim que eu faço. Você pode fazer isso da mesma maneira ou usar este código para ter ideias.
Aqui estão as extensões que uso:
Crédito albertbori / Extensões de String Swift Comum
Geralmente, eu sou um forte defensor das extensões, especialmente para necessidades como manipulação de cordas, pesquisa e corte.
fonte
String
tem recurso de substring embutido:Se o que você deseja é "ir para o primeiro índice de um caractere", você pode obter a substring usando a
find()
função embutida:Para encontrar o último índice, podemos implementar
findLast()
.ADICIONADO:
Talvez a
BidirectionalIndexType
versão especializada dofindLast
seja mais rápida:fonte
Você pode usar estas extensões:
Swift 2.3
Swift 3
Uso:
fonte
Swift 4:
você pode testá-lo da seguinte maneira:
Verifique a biblioteca https://gitlab.com/seriyvolk83/SwiftEx . Ele contém esses e outros métodos úteis.
fonte
Você deseja obter uma substring de uma string do índice inicial até o último índice de um de seus caracteres? Nesse caso, você pode escolher um dos seguintes métodos do Swift 2.0+.
Métodos que requerem
Foundation
Obtenha uma substring que inclua o último índice de um caractere:
Obtenha uma substring que NÃO inclua o último índice de um caractere:
Se você precisar repetir essas operações, a extensão
String
pode ser uma boa solução:Métodos que NÃO requerem
Foundation
Obtenha uma substring que inclua o último índice de um caractere:
Obtenha uma substring que NÃO inclua o último índice de um caractere:
Se você precisar repetir essas operações, a extensão
String
pode ser uma boa solução:fonte
Esta é uma maneira fácil e curta de obter uma substring se você souber o índice:
O aplicativo não travará se o índice exceder o comprimento da string:
Ambos os exemplos estão prontos para Swift 3 .
fonte
A única coisa que adiciona barulho é a repetição
stringVar
:stringVar [ stringVar .index ( stringVar .startIndex, offsetBy: ...)
Em Swift 4
Uma extensão pode reduzir isso:
Então, uso:
Deve-se notar que
to
efrom
são tipoSubstring
(ouString.SubSequance
). Eles não alocam novas strings e são mais eficientes para processamento.Para recuperar um
String
tipo,Substring
precisa ser convertido de volta paraString
:É aqui que uma string é finalmente alocada.
fonte
fonte
Swift 3
Bom artigo para compreensão, por que precisamos disso
fonte
Estendi String com dois métodos de substring. Você pode chamar substring com um intervalo de / para ou de / comprimento como:
fonte
Swift 2.0 O código abaixo foi testado no XCode 7.2. Por favor, consulte a imagem em anexo na parte inferior
fonte
Em Swift 5
Precisamos, em
String.Index
vez do valor Int simples, para representar o Índice.Lembre-se também, quando tentamos obter subString de Swift
String
(tipo de valor), na verdade temos que iterar comSequence
protocolo, que retornaString.SubSequence
tipo em vez deString
tipo.Para voltar
String
deString.SubSequence
, useString(subString)
Exemplo como abaixo:
fonte
Para Swift 2.0 , é assim:
fonte
Modifiquei a postagem de andrewz para torná-la compatível com Swift 2.0 (e talvez Swift 3.0). Na minha humilde opinião, esta extensão é mais fácil de entender e semelhante ao que está disponível em outras linguagens (como PHP).
fonte
Eu também construí uma extensão de string simples para Swift 4:
Portanto, você pode chamá-lo facilmente assim:
fonte
Tente esta
Int-based
solução alternativa:Nota: é apenas uma prática. Não verifica o limite. Modifique para atender às suas necessidades.
fonte
Aqui está uma maneira simples de obter substring em Swift
fonte