Tous les exemples suivants utilisent
var str = "Hello, playground"
Swift 4
Les chaînes ont subi une refonte assez importante dans Swift 4. Lorsque vous obtenez une sous-chaîne à partir d'une chaîne maintenant, vous récupérez un Substring
type plutôt qu'un String
. Pourquoi est-ce? Les chaînes sont des types de valeur dans Swift. Cela signifie que si vous utilisez une chaîne pour en créer une nouvelle, elle doit être copiée. C'est bon pour la stabilité (personne d'autre ne va le changer à votre insu) mais mauvais pour l'efficacité.
Une sous-chaîne, d'autre part, est une référence à la chaîne d'origine dont elle est issue. Voici une image de la documentation illustrant cela.
Aucune copie n'est nécessaire, il est donc beaucoup plus efficace à utiliser. Cependant, imaginez que vous ayez une sous-chaîne de dix caractères à partir d'une chaîne d'un million de caractères. Étant donné que la sous-chaîne fait référence à la chaîne, le système doit conserver la chaîne entière aussi longtemps que la sous-chaîne est présente. Ainsi, chaque fois que vous avez fini de manipuler votre sous-chaîne, convertissez-la en chaîne.
let myString = String(mySubstring)
Cela ne copiera que la sous-chaîne et la mémoire contenant l'ancienne chaîne peut être récupérée . Les sous-chaînes (en tant que type) sont censées être de courte durée.
Une autre grande amélioration dans Swift 4 est que les cordes sont des collections (encore). Cela signifie que tout ce que vous pouvez faire pour une collection, vous pouvez le faire pour une chaîne (utilisez des indices, parcourez les caractères, filtrez, etc.).
Les exemples suivants montrent comment obtenir une sous-chaîne dans Swift.
Obtention de sous-chaînes
Vous pouvez obtenir une chaîne d'une chaîne à l'aide ou plusieurs indices d'autres méthodes (par exemple prefix
, suffix
, split
). Cependant, vous devez toujours utiliser String.Index
et non un Int
index pour la plage. (Voir mon autre réponse si vous avez besoin d'aide à ce sujet.)
Début d'une chaîne
Vous pouvez utiliser un indice (notez la plage unilatérale de Swift 4):
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str[..<index] // Hello
ou prefix
:
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str.prefix(upTo: index) // Hello
ou encore plus simple:
let mySubstring = str.prefix(5) // Hello
Fin d'une chaîne
Utilisation d'indices:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str[index...] // playground
ou suffix
:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str.suffix(from: index) // playground
ou encore plus simple:
let mySubstring = str.suffix(10) // playground
Notez que lors de l'utilisation du suffix(from: index)
je devais recompter de la fin en utilisant -10
. Cela n'est pas nécessaire lors de l'utilisation suffix(x)
, qui ne prend que les derniers x
caractères d'une chaîne.
Plage dans une chaîne
Encore une fois, nous utilisons simplement des indices ici.
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..<end
let mySubstring = str[range] // play
Conversion Substring
enString
N'oubliez pas, lorsque vous êtes prêt à enregistrer votre sous-chaîne, vous devez la convertir en un String
afin que la mémoire de l'ancienne chaîne puisse être nettoyée.
let myString = String(mySubstring)
Vous utilisez une Int
extension d'index?
J'hésite à utiliser une Int
extension d'index basée après avoir lu l'article Strings dans Swift 3 par Airspeed Velocity et Ole Begemann. Bien que dans Swift 4, les chaînes soient des collections, l'équipe Swift n'a délibérément pas utilisé d' Int
index. C'est encore String.Index
. Cela a à voir avec les caractères Swift étant composés de nombres variables de points de code Unicode. L'index réel doit être calculé de manière unique pour chaque chaîne.
Je dois dire que j'espère que l'équipe Swift trouvera un moyen d'abstraire String.Index
à l'avenir. Mais jusqu'à eux, je choisis d'utiliser leur API. Cela m'aide à me rappeler que les manipulations de chaînes ne sont pas seulement de simples Int
recherches d'index.