Comment mettre à jour swift dictionnaire de la valeur
- Je réécrire ce code à partir de php. Et je trouve qu'il est difficile de le faire fonctionner en swift.
var arrayOfData = [AnyObject]()
for index in 1...5 {
var dict = [String: AnyObject]()
dict["data"] = [1,2,3]
dict["count"] = 0
arrayOfData.append(dict)
}
for d in arrayOfData {
let data = d as AnyObject
//I want to update the "count" value
//data["count"] = 8
print(data);
break;
}
- Pourquoi êtes-vous à l'aide de n'importe quel objet lorsque vous savez que c'est un dictionnaire?
Vous devez vous connecter pour publier un commentaire.
Sans doute, vous souhaitez mettre à jour la valeur à l'intérieur de
arrayOfData
lorsque vous affectezdata["count"] = 8
. Si vous passez à l'aide deNSMutableArray
etNSMutableDictionary
, puis votre code fonctionne comme vous le souhaitez. La raison pour laquelle cela fonctionne est que ces types sont des types référence (au lieu de la valeur des types comme Swift tableaux et des dictionnaires), de sorte que lorsque vous travaillez avec eux, vous faites référence à la valeur à l'intérieur d'eux au lieu de faire une copie.map
va recréer learrayOfData
qui sera de moins en moins efficace que celui-ci, puisque vous êtes directement en accédant auarrayOfData
éléments et de les changer.arrayOfData
est unNSMutableArray
donc les éléments à l'intérieur sontAnyObject
. Il est nécessaire de jeterd
àNSMutableDictionary
qui est ce que lalet data...
ligne ne. Cette opération sera efficace, card
etdata
font référence à la même valeur dans la mémoire, mais le compilateur sait alors le type de données quedata
références.(d as! NSMutableDictionary)["count"] = 8
, mais je ne le ferais pas.En supposant que votre tableau doit être de la forme " [AnyObject]", alors quelque chose comme ceci:
Mais de préférence votre tableau serait tapé comme un tableau de dictionnaires:
EDIT:
Donc, la question est que lorsque vous modifiez dans la boucle, vous êtes en train de créer une nouvelle version du dictionnaire de la matrice et la nécessité de les transférer vers l'arrière. Essayez d'utiliser une carte: