Swift 3.0 itérer sur la Chaîne.L'indice de gamme
Ce qui suit a été possible avec Swift 2.2:
let m = "alpha"
for i in m.startIndex..<m.endIndex {
print(m[i])
}
a
l
p
h
a
Avec la version 3.0, nous obtenons le message d'erreur suivant:
De Type "Plage" (aka "Gamme") n'est pas conforme à un protocole de Séquence"
Je suis en train de faire une opération très simple avec des cordes en swift -- simplement de parcourir à travers la première moitié de la chaîne (ou d'un problème générique: de parcourir à travers une gamme d'une chaîne).
Je peux faire ce qui suit:
let s = "string"
var midIndex = s.index(s.startIndex, offsetBy: s.characters.count/2)
let r = Range(s.startIndex..<midIndex)
print(s[r])
Mais ici, je ne suis pas vraiment de la traversée de la chaîne. La question est donc: comment puis-je parcourir à travers une gamme d'une chaîne donnée. Comme:
for i in Range(s.startIndex..<s.midIndex) {
print(s[i])
}
OriginalL'auteur p0lAris | 2016-07-15
Vous devez vous connecter pour publier un commentaire.
Vous pouvez parcourir une chaîne de caractères en utilisant
indices
propriété de lacharacters
propriété comme cela:De la la documentation dans la section Chaînes de caractères et les Caractères de Comptage de Caractères:
l'accent est mon propre.
Cela ne fonctionnera pas:
Range(1,3)
par exemple, pour une chaîne "string", résultant dans une traversée de plus det
,r
,i
.Je crois que @Khundragpan vous a donné un très bon point de départ. Voir la
offsetBy
que votre départ et un nombre pour votre gamme. Le transformer en quelque chose que vous pouvez utiliser est trivial.Je suis de la réception:
Type 'String?' has no subscript members
Merci!!!! Il fonctionne bien.
N. B. depuis
characters
a été dépréciée en Swift 4, vous devriez maintenant appelerindices
directement sur la chaîne elle-même.OriginalL'auteur Khundragpan
Une autre option est d'utiliser
enumerated()
e.g:ou pour Swift 4 suffit d'utiliser
la question posée à propos de Swift 3.0, néanmoins j'ai mis à jour la réponse
OriginalL'auteur Andrew
Utiliser les éléments suivants:
Prises de La migration vers Swift 2.3 ou Swift 3 de Swift 2.2
OriginalL'auteur Dmitry
Si vous voulez parcourir les personnages d'un
String
, alors au lieu de explicitement l'accès aux indices de laString
, vous pouvez simplement travailler avec lesCharacterView
de laString
, ce qui est conforme àCollectionType
, vous permettant d'accéder à neat subsequencing des méthodes telles queprefix(_:)
et ainsi de suite.Si vous souhaitez traiter les caractères à l'intérieur de la boucle comme des chaînes de caractères, il suffit d'utiliser
String(ch)
ci-dessus.Quant à votre commentaire ci-dessous: si vous souhaitez accéder à un éventail de la
CharacterView
, vous pouvez facilement mettre en place votre propre extension deCollectionType
(spécifique pour quandGenerator.Element
estCharacter
) en faisant usage des deuxprefix(_:)
etsuffix(_:)
pour obtenir une sous-collection donnée, par exemple une demi-ouverte (from..<to
) gammeRange(1, 3)
et, par conséquent, parcourant plus det
,r
&i
. Peut-être que nous avons également besoin d'utilisersuffix
là-bas pour obtenir la première partie de la plage (pas trop sûr).ajout d'une extension de l'exemple dans ma réponse, permettant la construction d'un sous-
CharacterView
pour unCharacterView
, où l'ancien peut naturellement être parcouru comme dans l'original de la réplique, en utilisant par exemplefor ... in
.OriginalL'auteur dfri
Itération sur les caractères dans une chaîne de caractères est plus propre à Swift 4:
OriginalL'auteur djruss70
La meilleure façon de le faire est :-
pour plus de détails, visitez ici
startIndex
devient plus lent à chaque itération, avec des temps de consommation pour les énormes chaînes de caractères (par exemple, l'ensemble des documents). Il est plus efficace de conserver le dernier indice autour et ajouter un offset de1
.OriginalL'auteur Nikhil Patil
Swift 4:
OriginalL'auteur Saif
À montrer concrètement comment parcourir par le biais d'une plage dans une chaîne de caractères dans Swift 4, nous pouvons utiliser la
where
filtre dans unfor
boucle de filtre de son exécution à la plage spécifiée:iterateStringByRange("string", from: 1, to: 3)
imprimet
,r
eti
OriginalL'auteur teacup
Swift 4.2
Simplement:
OriginalL'auteur Charlton Provatas