Question Obtenez la longueur d'une chaîne


Comment obtenez-vous la longueur d'un String? Par exemple, j'ai une variable définie comme:

var test1: String = "Scott"

Cependant, je n'arrive pas à trouver une méthode de longueur sur la chaîne.


680
2018-06-04 12:40


origine


Réponses:


À partir de Swift 4

C'est juste:

test1.count

pour des raisons.

(Merci à Martin R)

À partir de Swift 2:

Avec Swift 2, Apple a changé les fonctions globales en extensions de protocole, extensions qui correspondent à tout type conforme à un protocole. Ainsi, la nouvelle syntaxe est:

test1.characters.count

(Merci à JohnDifool pour les heads-up)

À partir de Swift 1

Utilisez la méthode des caractères de comptage:

let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
println("unusualMenagerie has \(count(unusualMenagerie)) characters")
// prints "unusualMenagerie has 40 characters"

directement depuis le guide Apple Swift

(note, pour les versions de Swift antérieures à 1.2, ce serait countElements(unusualMenagerie) au lieu)

pour votre variable, ce serait

length = count(test1) // was countElements in earlier versions of Swift

Ou vous pouvez utiliser test1.utf16count


1097
2018-06-04 12:41



TLDR:

Pour Swift 2.0 et 3.0, utilisation test1.characters.count. Mais, il y a quelques choses que tu devrais savoir. Alors, continuez à lire.

Compter les personnages dans Swift

Avant Swift 2.0, count était une fonction globale. À partir de Swift 2.0, il peut être appelé en tant que fonction membre.

test1.characters.count

Il renverra le nombre réel de caractères Unicode dans un String, donc c'est l'alternative la plus correcte dans le sens où, si vous imprimez la chaîne et comptez les caractères à la main, vous obtiendrez le même résultat.

Cependant, à cause du chemin Strings sont implémentés dans Swift, les personnages ne prennent pas toujours la même quantité de mémoire, alors sachez que cela se comporte différemment des méthodes habituelles de comptage de caractères dans d'autres langues.

Par exemple, vous pouvez également utiliser test1.utf16.count

Mais, comme indiqué ci-dessous, la valeur retournée n'est pas garantie être la même que celle de l'appel count sur characters.

De la référence de langue:

Les grappes de graphèmes étendues peuvent être composées d'un ou de plusieurs Unicode   scalaires. Cela signifie que différents caractères et différents   représentations du même caractère peuvent exiger des quantités différentes de   mémoire à stocker. Pour cette raison, les personnages de Swift ne prennent pas chacun   la même quantité de mémoire dans la représentation d'une chaîne. Comme un   résultat, le nombre de caractères d'une chaîne ne peut pas être calculé   sans itération à travers la chaîne pour déterminer son étendue   les limites du cluster graphème. Si vous travaillez particulièrement longtemps   valeurs de chaîne, sachez que la propriété de caractères doit itérer sur   les scalaires Unicode dans la chaîne entière afin de déterminer le   caractères pour cette chaîne.

Le nombre de caractères renvoyés par la propriété de caractères n'est pas   toujours la même chose que la propriété length d'un NSString qui contient   les mêmes caractères. La longueur d'un NSString est basée sur le nombre   des unités de code de 16 bits dans la représentation UTF-16 de la chaîne et non   le nombre de clusters de graphèmes étendus Unicode dans la chaîne.

Un exemple qui illustre parfaitement la situation décrite ci-dessus est celui de la vérification de la longueur d'une chaîne contenant un seul caractère emoji, comme indiqué par n00neimp0rtant dans les commentaires.

var emoji = ""
emoji.characters.count             //returns 1
emoji.utf16.count                  //returns 2

327
2018-06-04 12:41



Mise à jour de Swift 1.2: Il n'y a plus de countElements pour compter la taille des collections. Utilisez simplement la fonction count en guise de remplacement: count ("Swift")

 Swift 2.0, 3.0 et 3.1:

let strLength = string.characters.count   


85
2018-04-15 02:08



let str = "Hello"
let count = str.length    // returns 5 (Int)

extension String {
    var length: Int { return countElements(self) }  // Swift 1.1
}
extension String {
    var length: Int { return count(self)         }  // Swift 1.2
}
extension String {
    var length: Int { return characters.count    }  // Swift 2.0
}

57
2017-10-22 20:07



Swift 4

"string".count

;)

Swift 3

extension String {
    var length: Int {
        return self.characters.count
    }
}

usage

"string".length


43
2017-12-24 22:15



Si vous essayez simplement de voir si une chaîne est vide ou non (en vérifiant la longueur de 0), Swift offre une méthode de test booléenne simple sur String

myString.isEmpty

L'autre côté de cette pièce était les gens qui demandaient dans ObjectiveC comment demander si une chaîne était vide où la réponse était de vérifier une longueur de 0:

NSString est vide


19
2017-08-29 19:54



tl; dr Si vous voulez la longueur d'un type String en termes de nombre de caractères lisibles par l'utilisateur, utilisez countElements (). Si vous voulez connaître la longueur en termes de nombre de grappes de graphèmes étendues, utilisation endIndex. Lisez la suite pour plus de détails.

le Chaîne type est implémenté en tant que collection ordonnée (c'est-à-dire, séquence) de caractères Unicode et est conforme à CollectionType protocole, qui est conforme à la _CollectionType protocole, qui est le type d'entrée attendu par countElements (). Donc, countElements () peut être appelé, en passant un Chaîne tapez, et il renverra le nombre de caractères.

Cependant, en se conformant à CollectionType, qui à son tour se conforme à _CollectionType, Chaîne implémente également startIndex et endIndex propriétés calculées, qui représentent réellement la position de l'index avant le premier groupe de caractères et la position de l'index après le dernier groupe de caractères, respectivement. Ainsi, dans la chaîne "ABC", la position de l'index avant A est 0 et après C est 3. Par conséquent, endIndex = 3, qui est aussi la longueur de la chaîne.

Alors, endIndex peut être utilisé pour obtenir la longueur de tout type de chaîne, alors, non?

Eh bien, pas toujours ... Les caractères Unicode sont en fait grappes de graphèmes étendues, qui sont des séquences d'un ou plus Les scalaires Unicode combinés pour créer un seul caractère lisible par l'homme.

let circledStar: Character = "\u{2606}\u{20DD}" // ☆⃝

cercledStar est un caractère unique composé de U + 2606 (une étoile blanche), et U + 20DD (un cercle englobant de combinaison). Créons un Chaîne de cercledStar et comparez les résultats de countElements () et endIndex.

let circledStarString = "\(circledStar)"
countElements(circledStarString) // 1
circledStarString.endIndex // 2

15
2017-08-30 11:06



Voici quelque chose de plus court, et plus naturel que d'utiliser une fonction globale:

aString.utf16count

Je ne sais pas si c'est disponible en beta 1, cependant. Mais c'est définitivement là en beta 2.


13
2018-06-18 20:13



Dans Swift 2.0 count ne fonctionne plus. Vous pouvez l'utiliser à la place:

var testString = "Scott"
var length = testString.characters.count

13
2018-06-14 12:30



Mise à jour pour Xcode 6 beta 4, changement de méthode utf16count -> utf16Count

 var test1: String = "Scott"
 var length =  test1.utf16Count

Ou

 var test1: String = "Scott"
 var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)

9
2017-07-22 05:20



À partir de Swift 1.2 utf16Count a été retiré. Vous devriez maintenant utiliser le global count() fonctionne et passe la vue UTF16 de la chaîne. Exemple ci-dessous ...

let string = "Some string"
count(string.utf16)

9
2018-02-25 19:51