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?


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.


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"

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)

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]


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)

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)

12

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

dict.setValue("value", forKey: "key")

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.


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"

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)
        }
    }
}

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)

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 "?"]


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")

2
var dict = ["name": "Samira", "surname": "Sami"]
// Add a new enter code herekey with a value
dict["email"] = "sample@email.com"
print(dict)

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

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.


0

Swift 5 Happy Coding

var tempDicData = NSMutableDictionary()

for temp in answerList {
    tempDicData.setValue("your value", forKey: "your key")
}

-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) }

-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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.