Obtenir 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.
30 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, des 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 count characters:
let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
println("unusualMenagerie has \(count(unusualMenagerie)) characters")
// prints "unusualMenagerie has 40 characters"
Droit de la pomme Swift Guide de
(Notez que pour les versions de Swift antérieures à 1.2, ce serait countElements(unusualMenagerie)
à la place)
Pour votre variable, ce serait
length = count(test1) // was countElements in earlier versions of Swift
Ou vous pouvez utiliser test1.utf16count
TLDR:
Pour Swift 2.0 et 3.0, utiliser test1.characters.count
. Mais, il ya quelques choses que vous devez savoir. Alors, lisez la suite.
Comptage des caractères 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 retournera 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, en raison de la façon dont Strings
sont implémentés dans Swift, les caractères 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 langages.
Par exemple, vous pouvez également utiliser test1.utf16.count
Mais, comme indiqué ci-dessous, la valeur renvoyée n'est pas garantie d'être la même que celle de l'appel count
sur characters
.
De la référence de la langue:
Les clusters de graphèmes étendus peuvent être composés d'un ou plusieurs Unicode scalaire. Cela signifie que différents personnages - et différents représentations du même caractère - peut nécessiter différentes quantités de de mémoire pour les stocker. Pour cette raison, les caractères dans Swift ne prennent pas chacun la même quantité de mémoire dans la représentation d'une chaîne. En tant que résultat, le nombre de caractères dans une chaîne ne peut pas être calculé sans itérer à travers la chaîne pour déterminer son étendue graphème cluster limites. Si vous travaillez avec particulièrement longtemps valeurs de chaîne, soyez conscient que la propriété characters doit itérer sur les scalaires Unicode dans la chaîne entière afin de déterminer caractères pour cette chaîne.
Le nombre de caractères renvoyés par la propriété characters n'est pas toujours identique à la propriété length d'un NSString qui contient les mêmes personnages. La longueur D'un NSString est basée sur le nombre des unités de code 16 bits dans le représentation UTF-16 de la chaîne et non 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 vérifier 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
Mise à jour Swift 1.2: il n'y a plus de countElements pour compter la taille des collections. Utilisez simplement la fonction count en remplacement: count ("Swift")
Swift 2.0, 3.0 et 3.1:
Laissez strLength = string.caractère.compter
Swift 4.0: [Documentation Apple-Strings]
Laissez strLength = string.compter
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
}
Swift 4
"string".count
;)
Swift 3
extension String {
var length: Int {
return self.characters.count
}
}
Utilisation
"string".length
Si vous essayez simplement de voir si une chaîne est vide ou non (en vérifiant la longueur de 0), Swift propose une méthode de test booléenne simple sur String
myString.isEmpty
L'autre côté de cette pièce était les gens demandant dans ObjectiveC Comment demander si une chaîne était vide où la réponse était de vérifier une longueur de 0:
Tl; dr Si vous voulez la longueur d'un type de chaîne en termes de nombre de caractères lisibles par l'homme, utilisez countElements () . Si vous voulez connaître la longueur en termes de nombre de clusters de graphèmes étendus , Utilisez endIndex . Lire la suite pour les détails.
Le type String est implémenté comme une collection ordonnée (c'est-à-dire une séquence) de caractères Unicode, et il est conforme au protocoleCollectionType , qui est conforme au protocole _CollectionType protocole, qui est le type d'entrée prévu par countElements(). Par conséquent, countElements() peut être appelé, en passant un type String, et il retournera le nombre de caractères.
Cependant, en se conformant à CollectionType, qui est conforme à _CollectionType, String implémente également l' startIndex et endIndex propriétés calculées, qui représentent en fait la position de l'index avant, le premier caractère de cluster, et la position de l'index après le dernier caractère de cluster, 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.
Donc, endIndex peut être utilisé pour obtenir la longueur de n'importe quel type de chaîne, alors, non?
Eh bien, pas toujours...Les caractères Unicode sont en fait des clusters de graphèmes étendus , qui sont séquences d'un ou de plusieurs scalaires Unicode combinés pour créer un seul caractère lisible par l'homme.
let circledStar: Character = "\u{2606}\u{20DD}" // ☆⃝
CircledStar est un caractère unique composé de U + 2606 (une étoile blanche), et U+20DD (un cercle englobant combinant). Nous allons créer un String à partir de circledStar et de comparer les résultats de countElements() et endIndex.
let circledStarString = "\(circledStar)"
countElements(circledStarString) // 1
circledStarString.endIndex // 2
Voici quelque chose de plus court et de plus naturel que d'utiliser une fonction globale:
aString.utf16count
Je ne sais pas si c'est disponible en version bêta 1, si. Mais c'est définitivement là dans beta 2.
Dans Swift 2.0 count
ne fonctionne plus. Vous pouvez utiliser ceci à la place:
var testString = "Scott"
var length = testString.characters.count
Mise à jour pour Xcode 6 beta 4, changer la méthode utf16count -- > utf16Count
var test1: String = "Scott"
var length = test1.utf16Count
Ou
var test1: String = "Scott"
var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)
À partir de Swift 1.2 utf16Count
a été supprimé. Vous devriez maintenant utiliser la fonction globale count()
et passer la vue UTF16 de la chaîne. L'exemple ci-dessous...
let string = "Some string"
count(string.utf16)
Pour XCode 7.3 et Swift 2.2.
let str = ""
1) si vous voulez le nombre de caractères visuels:
str.characters.count // 1
2) Si vous voulez le 16-bit code units within the string’s UTF-16 representation
:
str.utf16.count // 2
La plupart du temps, 1) est ce dont vous avez besoin.
Quand auriez-vous besoin de 2)? J'ai trouvé un cas d'utilisation pour 2):
let regex = try! NSRegularExpression(pattern:"",
options: NSRegularExpressionOptions.UseUnixLineSeparators)
let str = ""
let result = regex.stringByReplacingMatchesInString(str,
options: NSMatchingOptions.WithTransparentBounds,
range: NSMakeRange(0, str.utf16.count), withTemplate: "dog")
print(result) // dogdogdogdogdogdog
Si vous utilisez 1), le résultat est incorrect:
let result = regex.stringByReplacingMatchesInString(str,
options: NSMatchingOptions.WithTransparentBounds,
range: NSMakeRange(0, str.characters.count), withTemplate: "dog")
print(result) // dogdogdog
Vous pouvez essayer comme ceci
var test1: String = "Scott"
var length = test1.bridgeToObjectiveC().length
Dans Swift 2.x voici comment trouver la longueur d'une chaîne
let findLength = "This is a string of text"
findLength.characters.count
Renvoie 24
Swift 2.0:
Obtenez un compte: yourString.text.characters.count
Un exemple amusant de la façon dont cela est utile serait d'afficher un compte à rebours de caractères à partir d'un certain nombre (150 par exemple) dans un UITextView:
func textViewDidChange(textView: UITextView) {
yourStringLabel.text = String(150 - yourStringTextView.text.characters.count)
}
Swift 4.2
let flag = ""
print(flag.count)
// Prints "1" -- Counts the characters and emoji as length 1
print(flag.unicodeScalars.count)
// Prints "2" -- Counts the unicode lenght ex. "A" is 65
print(flag.utf16.count)
// Prints "4"
print(flag.utf8.count)
// Prints "8"
Dans Xcode 6.1.1
extension String {
var length : Int { return self.utf16Count }
}
Je pense que brainiacs va changer cela sur chaque version mineure.
Récupère la valeur de chaîne de votre textview ou textfield:
let textlengthstring = (yourtextview?.text)! as String
Trouver le nombre de caractères dans la chaîne:
let numberOfChars = textlength.characters.count
Dans Swift 4 : Si la chaîne ne contient pas de caractères unicode, Utilisez
let str : String = "abcd"
let count = str.count // output 4
Si la chaîne contient des caractères unicode, utilisez ce qui suit:
let spain = "España"
let count1 = spain.count // output 6
let count2 = spain.utf8.count // output 7
Vous pouvez obtenir la longueur simplement en écrivant une extension:
extension String {
// MARK: Use if it's Swift 2
func stringLength(str: String) -> Int {
return str.characters.count
}
// MARK: Use if it's Swift 3
func stringLength(_ str: String) -> Int {
return str.characters.count
}
// MARK: Use if it's Swift 4
func stringLength(_ str: String) -> Int {
return str.count
}
}
var str = "Hello, playground"
var newString = str as NSString
countElements(str)
Cela compte les caractères dans la Chaîne Swift régulière
countElements((newString as String))
Cela compte les caractères dans un NSString
La meilleure façon de compter la chaîne dans Swift est la suivante:
var str = "Hello World"
var length = count(str.utf16)
String et NSString sont des ponts sans frais, vous pouvez donc utiliser toutes les méthodes disponibles pour NSString avec swift String
let x = "test" as NSString
let y : NSString = "string 2"
let lenx = x.count
let leny = y.count
test1.characters.count
Vous obtiendrez le nombre de lettres / chiffres, etc. dans votre chaîne.
Ex:
test1 = "StackOverflow"
print(test1.characters.count)
(imprime "13")
Apple l'a rendu différent des autres langues majeures. La façon actuelle est d'appeler:
Essai1.caractère.compter
Cependant, pour être prudent, quand vous dites Longueur, vous voulez dire le nombre de caractères pas le nombre d'octets, car ces deux peuvent être différents lorsque vous utilisez des caractères non-ascii.
Par exemple;
"你好啊hi".characters.count
vous donnera 5 mais ce n'est pas le nombre d'octets.
Pour obtenir le nombre réel d'octets, vous devez faire "你好啊hi".lengthOfBytes(using: String.Encoding.utf8)
. Cela vous donnera 11.
En ce moment (dans Swift 2.3) si vous utilisez:
myString.characters.count
La méthode retournera un type "Distance", si vous avez besoin de la méthode pour retourner un entier, vous devez taper cast comme ceci:
var count = myString.characters.count as Int
Voici ce que j'ai fini par faire
let replacementTextAsDecimal = Double(string)
if string.characters.count > 0 &&
replacementTextAsDecimal == nil &&
replacementTextHasDecimalSeparator == nil {
return false
}
Mise à jour Swift 4 comparant avec swift 3
Swift 4 supprime le besoin d'un tableau de caractères sur la chaîne. Cela signifie que vous pouvez appeler directement count
sur une chaîne sans obtenir le tableau de caractères en premier.
"hello".count // 5
Alors que dans swift 3, vous devrez obtenir un tableau de caractères, puis compter l'élément dans ce tableau. Notez que cette méthode suivante est toujours disponible dans swift 4.0 car vous pouvez toujours appeler characters
pour accéder au tableau de caractères de la chaîne donnée
"hello".characters.count // 5
Swift 4.0 adopte également Unicode 9 et il peut maintenant interpréter les clusters de graphèmes. Par exemple, compter sur un emoji vous donnera 1 alors que dans swift 3.0, vous pouvez obtenir des comptes supérieurs à 1.
"".count // Swift 4.0 prints 1, Swift 3.0 prints 2
"❤️".count // Swift 4.0 prints 1, Swift 3.0 prints 4
Mes deux cents pour swift 3/4
Si vous avez besoin de compiler conditionnellement
#if swift(>=4.0)
let len = text.count
#else
let len = text.characters.count
#endif
Swift 4
let str = "Your name"
str.count
Rappelez-vous: L'espace est également compté dans le nombre