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.

691
demandé sur Forge 2014-06-04 16:40:01

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

1122
répondu milesper 2018-07-19 00:24:56

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
328
répondu Cezar 2017-08-01 11:26:17

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

86
répondu San 2017-06-11 06:27:43
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
répondu Lee 2015-10-01 22:11:13

Swift 4

"string".count

;)

Swift 3

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

Utilisation

"string".length

43
répondu Vyacheslav 2017-06-07 19:26:54

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:

NSString est vide

20
répondu Kendall Helmstetter Gelner 2017-05-23 11:33:26

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
16
répondu Scott Gardner 2017-02-04 08:24:18

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.

13
répondu Jean Le Moignan 2014-06-18 20:13:21

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

var testString = "Scott"
var length = testString.characters.count
13
répondu Antoine 2018-03-13 14:19:47

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)
9
répondu Kiet Nguyen 2014-10-18 15:30:32

À 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)
9
répondu Jeremy Fox 2015-02-25 19:51:00

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
6
répondu Tyler Long 2016-07-03 11:32:58

Vous pouvez essayer comme ceci

var test1: String = "Scott"
var length =  test1.bridgeToObjectiveC().length
6
répondu Anil Varghese 2017-02-04 08:22:20

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

5
répondu Adam 2015-12-27 15:02:57

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)
}
4
répondu cjd 2015-10-01 06:52:40

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"
3
répondu Saranjith 2018-10-04 04:31:12

Dans Xcode 6.1.1

extension String {    
    var length : Int { return self.utf16Count  }
}

Je pense que brainiacs va changer cela sur chaque version mineure.

2
répondu user3812138 2017-02-04 08:24:51

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
2
répondu kalyan711987 2017-02-04 08:29:02

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
2
répondu Ashis Laha 2017-12-09 10:12:02

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
    }
}
2
répondu Riajur Rahman 2018-01-16 05:33:27
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

1
répondu brokenrhino 2014-10-13 16:08:17

La meilleure façon de compter la chaîne dans Swift est la suivante:

var str = "Hello World"
var length = count(str.utf16)
1
répondu Zaldy 2015-04-13 10:14:34

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
1
répondu Tien Dinh 2015-06-19 15:51:42
test1.characters.count

Vous obtiendrez le nombre de lettres / chiffres, etc. dans votre chaîne.

Ex:

test1 = "StackOverflow"

print(test1.characters.count)

(imprime "13")

1
répondu Andy Lebowitz 2016-03-05 18:24:25

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.

1
répondu Frank 2016-08-28 20:18:31

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
1
répondu Jesse 2016-08-31 19:15:25

Voici ce que j'ai fini par faire

let replacementTextAsDecimal = Double(string)

if string.characters.count > 0 &&
    replacementTextAsDecimal == nil &&
    replacementTextHasDecimalSeparator == nil {
        return false
}
1
répondu Bryan Clark 2017-04-26 04:07:39

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
1
répondu Fangming 2017-07-12 04:00:11

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
1
répondu ingconti 2017-08-23 21:56:39

Swift 4

let str =  "Your name"

str.count 

Rappelez-vous: L'espace est également compté dans le nombre

1
répondu Mr.Shin 2017-11-13 18:20:06