Comme un exercice d'apprentissage, je suis en train de utiliser un pour remplacer un String
dans un Array
(avec une valeur dictionnaire) pour en boucle si le String
est un clé existante dans un Dictionary
. Je sais déjà comment faire cela en utilisant .stringByReplacingOccurrencesOfString
, mais j'aimerais savoir ce que je fais de mal ici, et comment y parvenir avec une boucle for-in.Swift chaîne de remplacement dans le tableau à l'aide pour en boucle
let sillyMonkeyString = "A monkey stole my iPhone"
let dictionary = ["monkey": "", "iPhone":""]
var toArray = sillyMonkeyString.componentsSeparatedByString(" ")
// desired result is "A stole my "
Voici ce qui ne fonctionne pas:
for var str in toArray {
if let val = dictionary[str] {
str = val
}
}
let backToString = toArray.joinWithSeparator(" ")
Qu'est-ce que le travail:
var newArray = [String]()
for var str in toArray {
if let val = dictionary[str] {
str = val
}
newArray.append(str)
}
let backToString = newArray.joinWithSeparator(" ")
Cela fonctionne parce que je crée un nouveau tableau et annexant au nouveau tableau. Cependant, mon Array d'origine est mutable, alors pourquoi la première solution n'attribue-t-elle pas correctement str
à val
dans le Array
d'origine à l'intérieur de la boucle for-in? La seule autre question connexe que j'ai trouvé here a eu une excellente réponse d'une ligne qui n'a pas expliqué si oui ou non je peux accomplir cela en utilisant une boucle for-in.
MISE À JOUR: Je ne recommande pas l'implémentation d'une boucle for-in pour ce cas d'utilisation particulier. J'ai demandé à cette question d'apprendre comment pour ce faire. Si un utilisateur souhaite remplacer des parties de chaînes par un dictionnaire, je recommande fortement d'utiliser l'une des solutions les plus efficaces et les plus rapides ci-dessous (ce qui n'est peut-être pas la solution acceptée)
Puisque vous essayez d'apprendre par vous-même - voici un défi bonus: Plutôt que d'utiliser 'for-in', utilisez la fonction' reduce' sur le tableau. – Abizern
J'ai fait le cours sur udacity ainsi que – jbcd13
vous pouvez utiliser pour in loop (voir ma réponse), mais je vous recommande plus de solution «fonctionnelle» et swifty – user3441734