Mise à jour pour Swift 4
Dans Swift 4, se String
conforme à Collection
nouveau, il est donc possible d'utiliser dropFirst
et dropLast
de couper les débuts et les fins des chaînes. Le résultat est de type Substring
, vous devez donc le transmettre au String
constructeur pour récupérer un String
:
let str = "hello"
let result1 = String(str.dropFirst()) // "ello"
let result2 = String(str.dropLast()) // "hell"
dropFirst()
et dropLast()
prenez également un Int
pour spécifier le nombre de caractères à supprimer:
let result3 = String(str.dropLast(3)) // "he"
let result4 = String(str.dropFirst(4)) // "o"
Si vous spécifiez plus de caractères à supprimer que dans la chaîne, le résultat sera la chaîne vide ( ""
).
let result5 = String(str.dropFirst(10)) // ""
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 de substring(from:)
et substring(to:)
créer des ajouts utiles pour couper le début et la fin d'un String
:
extension String {
func chopPrefix(_ count: Int = 1) -> String {
return substring(from: index(startIndex, offsetBy: count))
}
func chopSuffix(_ count: Int = 1) -> String {
return substring(to: index(endIndex, offsetBy: -count))
}
}
"hello".chopPrefix() // "ello"
"hello".chopPrefix(3) // "lo"
"hello".chopSuffix() // "hell"
"hello".chopSuffix(3) // "he"
Comme dropFirst
et dropLast
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
et dropLast
(la meilleure solution précédente) ne sont pas aussi pratiques qu'avant. Avec une extension de String
, vous pouvez masquer la laideur de substringFromIndex
et substringToIndex
:
extension String {
func chopPrefix(count: Int = 1) -> String {
return self.substringFromIndex(advance(self.startIndex, count))
}
func chopSuffix(count: Int = 1) -> String {
return self.substringToIndex(advance(self.endIndex, -count))
}
}
"hello".chopPrefix() // "ello"
"hello".chopPrefix(3) // "lo"
"hello".chopSuffix() // "hell"
"hello".chopSuffix(3) // "he"
Comme dropFirst
et dropLast
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:
"hello".chopPrefix(count: 3) // "lo"
ou vous pouvez ajouter un trait _
de soulignement aux définitions de fonction pour supprimer le nom du paramètre:
extension String {
func chopPrefix(_ count: Int = 1) -> String {
return self.substringFromIndex(advance(self.startIndex, count))
}
func chopSuffix(_ count: Int = 1) -> String {
return self.substringToIndex(advance(self.endIndex, -count))
}
}
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.