Tous les exemples suivants utilisent
var str = "Hello, playground"
Swift 4
Les chaînes eu une grosse refonte Swift 4. Lorsque vous obtenez des sous-chaîne d'une Chaîne de maintenant, vous obtenez une Substring
type de retour plutôt qu'un String
. Pourquoi est-ce? Les chaînes de valeur sont les types de Swift. Cela signifie que si vous utilisez une Ficelle pour faire un nouveau, alors, il doit être copié. C'est bon pour la stabilité (pas d'autre va le modifier à votre insu), mais mauvais pour l'efficacité.
Une sous-Chaîne, d'autre part, est une référence à la Chaîne d'origine à partir de laquelle il est venu. Voici une image de la documentation illustrant que.
Aucune copie est nécessaire de sorte qu'il est beaucoup plus efficace à utiliser. Cependant, imaginez que vous avez une dizaine de sous-Chaîne de caractères à partir d'un million de Chaîne de caractères. Parce que la sous-Chaîne est de référencement de la Chaîne, le système de aurait à tenir sur l'ensemble de la Chaîne, tant que la sous-Chaîne est d'environ. Ainsi, chaque fois que vous avez terminé la manipulation de votre sous-Chaîne, de les convertir en une Chaîne de caractères.
let myString = String(mySubstring)
Cela va copier la sous-chaîne-dessus et de la vieille Chaîne peut être nettoyée. Les sous-chaînes (type a) sont destinés à être de courte durée.
Une autre grande amélioration dans Swift 4 est que les Chaînes de caractères sont des Collections (encore une fois). Cela signifie que tout ce que vous pouvez faire pour une Collection, vous pouvez le faire en une Chaîne (utiliser des indices, itérer sur les personnages, filtre, etc).
Les exemples suivants montrent comment obtenir une sous-chaîne dans Swift.
L'obtention de sous-chaînes
Vous pouvez obtenir une sous-chaîne d'une chaîne à l'aide des indices ou un certain nombre d'autres méthodes (par exemple, prefix
, suffix
, split
). Vous devez toujours utiliser String.Index
et pas un Int
pour l'indice de gamme. (Voir mon autre réponse, si vous avez besoin d'aide avec cela.)
Début d'une chaîne
Vous pouvez utiliser un indice (note de la Swift 4 unilatérale de gamme):
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
À l'aide des 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 de l' suffix(from: index)
j'ai eu à faire le compte à rebours à partir de la fin à l'aide -10
. Ce n'est pas nécessaire quand il vient à l'aide d' suffix(x)
, ce qui prend tout de dernier x
caractères d'une Chaîne.
Gamme dans une chaîne de caractères
De nouveau nous avons simplement utiliser 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
Convertir Substring
de String
N'oubliez pas, lorsque vous êtes prêt à enregistrer votre chaîne, vous devez le convertir en String
, de sorte que le vieux de la chaîne de la mémoire peut être nettoyé.
let myString = String(mySubstring)
À l'aide d'un Int
de l'indice de l'extension?
J'hésite à utiliser un Int
index de base de l'extension après la lecture de l'article de Chaînes dans Swift 3 par Vitesse de Vitesse et Ole Begemann. Bien que dans Swift 4, les Chaînes sont des collections, la Swift de l'équipe délibérément n'a pas utilisé Int
index. Il est encore String.Index
. Cela a à voir avec la Swift Caractères étant composé d'un nombre variable d'Unicode codepoints. L'indice réel doit être unique calculée pour chaque chaîne.
Je dois dire, j'espère que l'équipe Swift trouve un moyen de faire abstraction String.Index
dans le futur. Mais jusqu'à eux, je me suis choisissent d'utiliser leur API. Il m'aide à me souvenir que les manipulations de chaînes ne sont pas de simples Int
de l'indice des recherches.