Comment gérer la cohabitation des chaines (string) et sous-chaines de caractères (substrings) en Swift ?

Le langage Swift présente entre autres particularités une gestion des chaînes différentes des autres langages. Il existe des chaînes ("string") comme dans la plupart des autres langages mais aussi des sous-chaînes ("substring"). Bien que les deux soient proches, elles ne s'utilisent pas de la même façon.

La sous-chaîne est en fait la représentation d'un morceau d'une chaîne de caractères. Afin d'économiser l'espace mémoire utilisé par l'application, une sous-chaîne n'est pas une copie. Elle est directement liée à la chaîne et en conséquence la modifier modifie également la chaîne de caractères. Les sous-chaînes se manipulent à l'aide d'index qui sont générés par la méthode "index" de la classe "String". Alors que dans les autres langages, les index numériques fonctionnent, leur utilisation est déconseillée dans le langage Swift car un caractère peut être codé sur plusieurs octets.

Une sous-chaîne est obtenue en faisant appel aux différentes méthodes de découpe de chaînes disponibles dans la classe "String".

Pour obtenir le début d'une chaîne, on peut soit utiliser la méthode dédiée "prefix()", soit la notation rapide de la version 4 de Swift.

//Pour obtenir les 3 premiers caractères d'une chaîne
let index = maChaine.index(maChaine.startIndex, offsetBy: 3)
let maSousChaine = maChaine.prefix(upTo: index)
let maSousChaine = maChaine.prefix(3)
//Notation rapide ajoutée par la version 4 de Swift
let maSousChaine = maChaine[..<index]
Pour obtenir la fin d'une chaîne, on peut utiliser soit la notation rapide, soit la méthode "suffix()".
//Pour obtenir les 4 derniers caractères d'une chaîne
let index = maChaine.index(maChaine.endIndex, offsetBy: 4)
let maSousChaine = maChaine.suffix(from: index)
let maSousChaine = maChaine.suffix(4)
//Notation rapide ajoutée par la version 4 de Swift
let maSousChaine = maChaine[index...]
On peut également récupérer une portion entre deux index grâce à une notation spécifique.
let debut = maChaine.index(maChaine.startIndex, offsetBy: 3)
let fin = str.index(maChaine.endIndex, offsetBy: 4)
let portion = debut..<fin
let maSousChaine = maChaine[portion]

Si vous souhaitez sauvegarder votre sous-chaîne pour la rendre indépendante de la chaîne dont elle est issue, il suffit de la convertir en chaîne de caractères grâce à une conversion de type.

let maNouvelleChaine = String(maSousChaine)

iOS / Mac