Comment ajouter des éléments dans un dictionnaire dans Swift?

217

J'ai un dictionnaire simple qui se définit comme:

var dict : NSDictionary = [ 1 : "abc", 2 : "cde"]

Maintenant, je veux ajouter un élément dans ce dictionnaire: 3 : "efg"

Comment puis-je ajouter 3 : "efg"à ce dictionnaire existant?

Dharmesh Kheni
la source
utiliser NSMutableDictionary
Saurabh Prajapati
1
Êtes-vous sûr de vouloir un dictionnaire et non un tableau, car vos clés semblent être les chiffres 1, 2 et 3?
gnasher729

Réponses:

240

Vous utilisez NSDictionary. À moins que vous n'en ayez explicitement besoin pour ce type de raison, je vous recommande d'utiliser un dictionnaire Swift.

Vous pouvez passer un dictionnaire Swift à n'importe quelle fonction attend NSDictionarysans aucun travail supplémentaire, car Dictionary<>et en NSDictionarytoute transparence les uns aux autres. L'avantage de la méthode Swift native est que le dictionnaire utilise des types génériques, donc si vous le définissez avec Intcomme clé et Stringcomme valeur, vous ne pouvez pas utiliser par erreur des clés et des valeurs de différents types. (Le compilateur vérifie les types en votre nom.)

En fonction de ce que je vois dans votre code, votre dictionnaire utilise Intcomme clé et Stringcomme valeur. Pour créer une instance et ajouter un élément ultérieurement, vous pouvez utiliser ce code:

var dict = [1: "abc", 2: "cde"] // dict is of type Dictionary<Int, String>
dict[3] = "efg"

Si vous devez ensuite l'affecter à une variable de NSDictionarytype, faites simplement un cast explicite:

let nsDict = dict as! NSDictionary

Et, comme mentionné précédemment, si vous voulez le passer à une fonction attendue NSDictionary, passez-le tel quel sans conversion ni conversion.

Antonio
la source
Merci pour une explication appropriée de ce qu'une personne devrait réellement faire. En utilisant la commodité de Swift pour créer et manipuler un Dictionaryobjet, puis le convertir NSDictionaryà la fin si vous en avez besoin. Merveilleux. Merci.
Joshua Pinter
Y a-t-il de toute façon que je peux ajouter à la même clé en utilisant un délimiteur (similaire à addValue ). Je veux dire ajouter une "Antonio"clé à 1donc dic[1]reviendrait "abc, Antonio".
Honey
@honey pas que je sache ... mais c'est un simple ajout si l'élément existe déjà
Antonio
113

vous pouvez ajouter en utilisant la manière suivante et passer DictionaryàNSMutableDictionary

dict["key"] = "value"
yashwanth77
la source
2
J'ai une erreur qui ditCannot assign to the result of this expression
Dharmesh Kheni
ajoutez cette façon pour votre question dict [3] = "efg";
yashwanth77
vérifier ma réponse éditée son travail pour moi.changer le dictionnaire pour Mutable celui qu'il fonctionne!
yashwanth77
1
dict["testval"] = "test".. Erreurfatal error: unexpectedly found nil while unwrapping an Optional value
jose920405
2
Cela ne fonctionnera pas avec 2.2+, dict est en lecture seule dans cette expression
jeveloper
67

Je sais que cela pourrait arriver très tard, mais cela pourrait s'avérer utile pour quelqu'un. Ainsi, pour ajouter des paires clé-valeur aux dictionnaires dans swift, vous pouvez utiliser la méthode updateValue (value:, forKey:) comme suit:

var dict = [ 1 : "abc", 2 : "cde"]
dict.updateValue("efg", forKey: 3)
print(dict)
HeadOnn
la source
49

SWIFT 3 - XCODE 8.1

var dictionary =  [Int:String]() 

dictionary.updateValue(value: "Hola", forKey: 1)
dictionary.updateValue(value: "Hello", forKey: 2)
dictionary.updateValue(value: "Aloha", forKey: 3)

Ainsi, votre dictionnaire contient:

dictionnaire [1: Hola, 2: Bonjour, 3: Aloha]

Cristian Mora
la source
3
Comment est-ce mieux que ça dictionary[1] = "Hola"?
Ben Leggiero
C'est simplement une autre façon de le faire. Tout dépend de ce dont vous avez besoin! Dans mon cas, c'est la meilleure façon
Cristian Mora
4
Je comprends que vous pensez que c'est mieux; c'est pourquoi vous l'avez posté. Mais je ne vois pas comment c'est mieux. S'il vous plaît, dites-moi comment c'est mieux
Ben Leggiero
Je suis d'accord qu'il devrait y avoir une méthode appelée "addValue" ou "setValue", que "updateValue" devrait être utilisé pour la MISE À JOUR comme son nom l'indique
pkarc
La raison en est que lorsque le dictionnaire a été init be a une valeur [] différente de nil, il est donc nécessaire d'utiliser la propriété updateValue car nous essayons de modifier la valeur et de ne pas l'insérer.
Cristian Mora
16

Si votre dictionnaire est Intpour Stringvous, vous pouvez faire simplement:

dict[3] = "efg"

Si vous voulez ajouter des éléments à la valeur du dictionnaire, une solution possible:

var dict = Dictionary<String, Array<Int>>()

dict["key"]! += [1]
dict["key"]!.append(1)
dict["key"]?.append(1)
Alex Gidan
la source
16

Swift 3+

Exemple pour attribuer de nouvelles valeurs au dictionnaire. Vous devez le déclarer comme NSMutableDictionary:

var myDictionary: NSMutableDictionary = [:]
let newValue = 1
myDictionary["newKey"] = newValue
print(myDictionary)
Dasoga
la source
12

Dans Swift, si vous utilisez NSDictionary , vous pouvez utiliser setValue:

dict.setValue("value", forKey: "key")
lojals
la source
1
modifié votre réponse, à l'avenir, envisagez d'ajouter plus d'informations pour éviter les downvotes.
Juan Boero
11

Étant donné deux dictionnaires comme ci-dessous:

var dic1 = ["a": 1, "c": 2]
var dic2 = ["e": 3, "f": 4]

Voici comment ajouter tous les éléments de dic2 à dic1 :

dic2.map {
   dic1[$0.0] = $0.1
}

À la vôtre A.

Amin Tavassolian
la source
9
Il est préférable d'utiliser .forEachau lieu de .mapcar nous n'avons pas besoin de tableau mappé de retour
haik.ampardjian
9

Dict.updateValue met à jour la valeur de la clé existante à partir du dictionnaire ou ajoute une nouvelle nouvelle paire clé-valeur si la clé n'existe pas.

Exemple-

var caseStatusParams: [String: AnyObject] = ["userId" : UserDefault.userID ]
caseStatusParams.updateValue("Hello" as AnyObject, forKey: "otherNotes")

Résultat-

: 2 elements
    - key : "userId"
    - value : 866: 2 elements
    - key : "otherNotes"
    - value : "Hello"
Varsha Gaikwad
la source
7

Pour les boursiers utilisant [String:Any]au lieu de Dictionaryci-dessous l'extension

extension Dictionary where Key == String, Value == Any {

    mutating func append(anotherDict:[String:Any]) {
        for (key, value) in anotherDict {
            self.updateValue(value, forKey: key)
        }
    }
}
Dhaval H. Nena
la source
4

Depuis Swift 5, la collection de codes suivante fonctionne.

 // main dict to start with
 var myDict : Dictionary = [ 1 : "abc", 2 : "cde"]

 // dict(s) to be added to main dict
 let myDictToMergeWith : Dictionary = [ 5 : "l m n"]
 let myDictUpdated : Dictionary = [ 5 : "lmn"]
 let myDictToBeMapped : Dictionary = [ 6 : "opq"]

 myDict[3]="fgh"
 myDict.updateValue("ijk", forKey: 4)

 myDict.merge(myDictToMergeWith){(current, _) in current}
 print(myDict)

 myDict.merge(myDictUpdated){(_, new) in new}
 print(myDict)

 myDictToBeMapped.map {
     myDict[$0.0] = $0.1
 }
 print(myDict)
Lord Anubis
la source
4

Il n'y a pas de fonction pour ajouter les données dans le dictionnaire. Vous attribuez simplement la valeur à une nouvelle clé dans le dictionnaire existant. il ajoutera automatiquement de la valeur au dictionnaire.

var param  = ["Name":"Aloha","user" : "Aloha 2"]
param["questions"] = "Are you mine?"
print(param)

La sortie sera comme

["Nom": "Aloha", "utilisateur": "Aloha 2", "questions": "" Êtes-vous à moi "?"]

Talha Rasool
la source
3
For whoever reading this for swift 5.1+

  // 1. Using updateValue to update the given key or add new if doesn't exist


    var dictionary = [Int:String]()    
    dictionary.updateValue("egf", forKey: 3)



 // 2. Using a dictionary[key]

    var dictionary = [Int:String]()    
    dictionary[key] = "value"



 // 3. Using subscript and mutating append for the value

    var dictionary = [Int:[String]]()

    dictionary[key, default: ["val"]].append("value")
Lalit Yadav
la source
2
var dict = ["name": "Samira", "surname": "Sami"]
// Add a new enter code herekey with a value
dict["email"] = "[email protected]"
print(dict)
Reine Semiramis
la source
1
Veuillez fournir des informations sur les raisons pour lesquelles cette réponse résout le problème
Stephen Reindl
@StephenReindl Si vous l'exécutez, vous verrez;)
Ben Leggiero
1

Pour ajouter de nouveaux éléments, il suffit de définir:

listParrameters["your parrameter"] = value
Tung Tran
la source
0

Jusqu'à présent, le meilleur moyen que j'ai trouvé pour ajouter des données à un dictionnaire en utilisant l'une des fonctions d'ordre supérieur de Swift, c'est-à-dire "réduire". Suivez l'extrait de code ci-dessous:

newDictionary = oldDictionary.reduce(*newDictionary*) { r, e in var r = r; r[e.0] = e.1; return r }

@ Dharmesh Dans votre cas, ce sera,

newDictionary = dict.reduce([3 : "efg"]) { r, e in var r = r; r[e.0] = e.1; return r }

Veuillez me faire savoir si vous rencontrez des problèmes lors de l'utilisation de la syntaxe ci-dessus.

Shobhit C
la source
0

Swift 5 Happy Coding

var tempDicData = NSMutableDictionary()

for temp in answerList {
    tempDicData.setValue("your value", forKey: "your key")
}
Shakeel Ahmed
la source
-1

J'ai ajouté l'extension Dictionary

extension Dictionary {   
  func cloneWith(_ dict: [Key: Value]) -> [Key: Value] {
    var result = self
    dict.forEach { key, value in result[key] = value }
    return result  
  }
}

vous pouvez utiliser cloneWithcomme ça

 newDictionary = dict.reduce([3 : "efg"]) { r, e in r.cloneWith(e) }
jimi
la source
-10

si vous souhaitez modifier ou mettre à jour NSDictionary, commencez par le transcrire en NSMutableDictionary

let newdictionary = NSDictionary as NSMutableDictionary

puis utilisez simplement

 newdictionary.setValue(value: AnyObject?, forKey: String)
Sonu Verma
la source