Je souhaite supprimer le premier caractère d'une chaîne. Jusqu'à présent, la chose la plus succincte que j'ai trouvée est:
display.text = display.text!.substringFromIndex(advance(display.text!.startIndex, 1))
Je sais que nous ne pouvons pas indexer dans une chaîne avec un à Int
cause d'Unicode, mais cette solution semble terriblement verbeuse. Y a-t-il une autre façon que je néglige?
advance
cela endisplay.text!
effectuant un casting vers NSString. Je ne dis pas que c'est une bonne solution - il suffit de corriger une éventuelle idée fausse. Avec NSString, vous pouvez y indexer avec Int. - Et la raison pour laquelle vous ne pouvez pas indexer avec Int n'est pas à cause d'Unicode; c'est parce qu'un caractère peut être composé de plusieurs points de code composés.String
alors Swift 3 a introduit lacapitalized
fonction àString
.Réponses:
Si vous utilisez Swift 3 , vous pouvez ignorer la deuxième section de cette réponse. La bonne nouvelle est que c'est à nouveau succinct! Simplement en utilisant la nouvelle méthode remove (at :) de String.
J'aime la
dropFirst()
fonction globale pour cela.C'est court, clair et fonctionne pour tout ce qui est conforme au protocole Sliceable.
Si vous utilisez Swift 2 , cette réponse a changé. Vous pouvez toujours utiliser dropFirst, mais pas sans supprimer le premier caractère de votre
characters
propriété strings , puis reconvertir le résultat en String. dropFirst est également devenu une méthode, pas une fonction.Une autre alternative consiste à utiliser la fonction suffixe pour épisser la chaîne
UTF16View
. Bien sûr, cela doit également être reconverti en chaîne par la suite.Tout cela pour dire que la solution que j'ai fournie à l'origine ne s'est pas avérée être le moyen le plus succinct de le faire dans les nouvelles versions de Swift. Je recommande de revenir sur la solution de @chris
removeAtIndex()
si vous recherchez une solution courte et intuitive.Et comme indiqué par @vacawama dans les commentaires ci-dessous, une autre option qui ne modifie pas la chaîne d'origine est d'utiliser substringFromIndex.
Ou si vous cherchez à supprimer un caractère du début et de la fin de la chaîne, vous pouvez utiliser substringWithRange. Assurez-vous simplement de vous prémunir contre la condition quand
startIndex + n > endIndex - m
.La dernière ligne peut également être écrite en utilisant la notation en indice.
la source
remove(at:)
méthode: c'est le caractère supprimé, pas la nouvelle chaîne. Par exemplelet removedCharacter = myString.remove(at: myString.startIndex)
,. Je faisais l'erreur de renvoyer le résultat de l'appel de méthode, oubliant que c'était le cas dans cette approche. Bon codage à tous!Mise à jour pour Swift 4
Dans Swift 4, se
String
conforme àCollection
nouveau, il est donc possible d'utiliserdropFirst
etdropLast
de couper les débuts et les fins des chaînes. Le résultat est de typeSubstring
, vous devez donc le transmettre auString
constructeur pour récupérer unString
:dropFirst()
etdropLast()
prenez également unInt
pour spécifier le nombre de caractères à supprimer:Si vous spécifiez plus de caractères à supprimer que dans la chaîne, le résultat sera la chaîne vide (
""
).Mise à jour pour Swift 3
Si vous souhaitez simplement supprimer le premier caractère et que vous souhaitez modifier la chaîne d'origine en place, consultez la réponse de @ MickMacCallum. Si vous souhaitez créer une nouvelle chaîne dans le processus, utilisez
substring(from:)
. Avec une extension àString
, vous pouvez masquer la laideur desubstring(from:)
etsubstring(to:)
créer des ajouts utiles pour couper le début et la fin d'unString
:Comme
dropFirst
etdropLast
avant eux, ces fonctions planteront s'il n'y a pas assez de lettres disponibles dans la chaîne. Il incombe à l'appelant de les utiliser correctement. Il s'agit d'une décision de conception valide. On pourrait les écrire pour renvoyer un optionnel qui devrait alors être déballé par l'appelant.Swift 2.x
Hélas dans Swift 2 ,
dropFirst
etdropLast
(la meilleure solution précédente) ne sont pas aussi pratiques qu'avant. Avec une extension deString
, vous pouvez masquer la laideur desubstringFromIndex
etsubstringToIndex
:Comme
dropFirst
etdropLast
avant eux, ces fonctions planteront s'il n'y a pas assez de lettres disponibles dans la chaîne. Il incombe à l'appelant de les utiliser correctement. Il s'agit d'une décision de conception valide. On pourrait les écrire pour renvoyer un optionnel qui devrait alors être déballé par l'appelant.Dans Swift 1.2 , vous devrez appeler
chopPrefix
comme ceci:ou vous pouvez ajouter un trait
_
de soulignement aux définitions de fonction pour supprimer le nom du paramètre:la source
Swift 2.2
Swift 3.0
Swift 3.2
Swift 4
la source
Dans Swift 2, procédez comme suit:
Je recommande https://www.mikeash.com/pyblog/friday-qa-2015-11-06-why-is-swifts-string-api-so-hard.html pour comprendre les chaînes Swift.
la source
Cela dépend de ce que vous voulez que le résultat final soit (mutant vs non mutant).
À partir de Swift 4.1:
Mutation:
Non mutant:
Remarques:
nonmutating
exemple pour plus de clarté. Subjectivement, combiner les deux dernières étapes serait plus succinct.dropFirst
me semble un peu étrange, car si je comprends correctement les directives de conception de l'API Swift , celadropFirst
devrait vraiment être quelque chose commedropingFirst
parce qu'il est non mutant. Juste une pensée :).la source
droppingFirst
- ils ont foiré!Et ça?
Cela suppose bien sûr que votre chaîne est modifiable. Il renvoie le caractère qui a été supprimé, mais modifie la chaîne d'origine.
la source
Les réponses précédentes sont plutôt bonnes, mais à partir d'aujourd'hui, je pense que c'est peut-être le moyen le plus succinct de supprimer le premier caractère d'une chaîne dans Swift 4 :
la source
Je ne connais rien de plus succinct hors de la boîte, mais vous pouvez facilement implémenter un préfixe
++
, par exemple,Après quoi, vous pouvez l'utiliser à votre guise de manière très succincte:
la source
Dans Swift 2, utilisez cette extension String:
la source
la source
Pour supprimer le premier caractère de la chaîne
la source
Voici une version de sauvegarde du crash Swift4 de l'
chopPrefix
extension, laissantchopSuffix
à la communauté ...la source
Swift3
la source