Quero excluir o primeiro caractere de uma string. Até agora, a coisa mais sucinta que me foi apresentada é:
display.text = display.text!.substringFromIndex(advance(display.text!.startIndex, 1))
Eu sei que não podemos indexar em uma string com um Int
por causa do Unicode, mas essa solução parece muito detalhada. Existe outra maneira que eu estou ignorando?
advance
coisa todadisplay.text!
transmitindo para o NSString. Não estou dizendo que é uma boa solução - apenas corrigindo um possível equívoco. Com o NSString, você pode indexá-lo com o Int. - E a razão pela qual você não pode indexar com Int não é por causa do Unicode; é porque um personagem pode consistir em vários pontos de código compostos.String
Swift 3, introduziu acapitalized
funçãoString
.Respostas:
Se você estiver usando o Swift 3 , poderá ignorar a segunda seção desta resposta. A boa notícia é que isso agora é realmente sucinto novamente! Apenas usando o novo método remove (at :) do String.
Eu gosto da
dropFirst()
função global para isso.É curto, claro e funciona para qualquer coisa que esteja em conformidade com o protocolo Sliceable.
Se você estiver usando o Swift 2 , esta resposta mudou. Você ainda pode usar dropFirst, mas não sem soltar o primeiro caractere da
characters
propriedade strings e depois converter o resultado em uma String. O dropFirst também se tornou um método, não uma função.Outra alternativa é usar a função de sufixo para emendar as strings
UTF16View
. Obviamente, isso também deve ser convertido novamente em uma String.Tudo isso significa que a solução que forneci originalmente não se mostrou a maneira mais sucinta de fazer isso nas versões mais recentes do Swift. Eu recomendo recorrer à solução @chris 'usando
removeAtIndex()
se você estiver procurando uma solução curta e intuitiva.E, como apontado por @vacawama nos comentários abaixo, outra opção que não modifica a String original é usar substringFromIndex.
Ou, se você estiver procurando descartar um caractere no início e no final da String, poderá usar substringWithRange. Apenas certifique-se de se proteger contra a condição quando
startIndex + n > endIndex - m
.A última linha também pode ser escrita usando notação subscrita.
fonte
remove(at:)
método: é o caractere removido, não a nova string. Por exemplolet removedCharacter = myString.remove(at: myString.startIndex)
,. Eu estava cometendo o erro de retornar o resultado da chamada de método, esquecendo que esse era o caso nessa abordagem. Feliz codificação tudo!Atualização para Swift 4
No Swift 4,
String
está em conformidadeCollection
novamente, portanto, é possível usardropFirst
edropLast
aparar o início e o fim das strings. O resultado é do tipoSubstring
, então você precisa passar isso para oString
construtor para recuperar umString
:dropFirst()
edropLast()
também use umInt
para especificar o número de caracteres a serem descartados:Se você especificar mais caracteres a serem descartados do que na cadeia, o resultado será a cadeia vazia (
""
).Atualização para Swift 3
Se você deseja apenas remover o primeiro caractere e alterar a sequência original, consulte a resposta de @ MickMacCallum. Se você deseja criar uma nova string no processo, use
substring(from:)
. Com uma extensão paraString
, você pode ocultar a feiurasubstring(from:)
esubstring(to:)
criar adições úteis para aparar o início e o fim de umString
:Como
dropFirst
edropLast
antes delas, essas funções falharão se não houver letras suficientes disponíveis na String. O ônus está no chamador para usá-los corretamente. Esta é uma decisão de design válida. Alguém poderia escrevê-los para retornar um opcional que, em seguida, teria que ser desembrulhado pelo chamador.Swift 2.x
Infelizmente no Swift 2 ,
dropFirst
edropLast
(a melhor solução anterior) não são tão convenientes quanto antes. Com uma extensão paraString
, você pode ocultar a feiurasubstringFromIndex
esubstringToIndex
:Como
dropFirst
edropLast
antes delas, essas funções falharão se não houver letras suficientes disponíveis na String. O ônus está no chamador para usá-los corretamente. Esta é uma decisão de design válida. Alguém poderia escrevê-los para retornar um opcional que, em seguida, teria que ser desembrulhado pelo chamador.No Swift 1.2 , você precisará chamar
chopPrefix
assim:ou você pode adicionar um sublinhado
_
às definições da função para suprimir o nome do parâmetro:fonte
Swift 2.2
Swift 3.0
Swift 3.2
Swift 4
fonte
No Swift 2, faça o seguinte:
Eu recomendo https://www.mikeash.com/pyblog/friday-qa-2015-11-06-why-is-swifts-string-api-so-hard.html para entender melhor as strings Swift.
fonte
Depende do que você deseja que seja o resultado final (mutação vs não mutação).
A partir do Swift 4.1:
Mutação:
Não mutante:
Notas:
nonmutating
exemplo para maior clareza. Subjetivamente, combinar os dois últimos passos seria mais sucinto.dropFirst
parece um pouco estranha para mim, porque, se estou entendendo as Diretrizes de Design da API Swift corretamente,dropFirst
deve ser algo comodropingFirst
isso porque não muda. Apenas um pensamento :).fonte
droppingFirst
- eles estragaram tudo!Que tal isso?
Obviamente, isso pressupõe que sua string é mutável. Retorna o caractere que foi removido, mas altera a string original.
fonte
As respostas anteriores são muito boas, mas a partir de hoje, acho que essa pode ser a maneira mais sucinta de remover o primeiro caractere de uma string no Swift 4 :
fonte
Não conheço nada mais sucinto pronto para uso, mas você pode implementar facilmente o prefixo
++
, por exemplo,Depois disso, você pode usá-lo de maneira muito sucinta no conteúdo do seu coração:
fonte
No Swift 2, use esta extensão String:
fonte
fonte
Para remover o primeiro caractere da string
fonte
Aqui está uma versão do Swift4 salva da falha
chopPrefix
, deixandochopSuffix
para a comunidade ...fonte
Swift3
fonte