Come aggiungere elementi in un dizionario in Swift?


217

Ho un dizionario semplice che è definito come:

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

Ora voglio aggiungere un elemento in questo dizionario: 3 : "efg"

Come posso aggiungere 3 : "efg"in questo dizionario esistente?


usa NSMutableDictionary
Saurabh Prajapati il

1
Sei sicuro di voler un dizionario e non un array, poiché le tue chiavi sembrano essere i numeri 1, 2 e 3?
gnasher729,

Risposte:


240

Stai usando NSDictionary. A meno che tu non abbia esplicitamente bisogno che sia quel tipo per qualche motivo, ti consiglio di usare un dizionario Swift.

È possibile passare un dizionario Swift a qualsiasi funzione che si aspetta NSDictionary, senza alcun lavoro supplementare, perché Dictionary<>e NSDictionarysenza soluzione di continuità colmare gli uni agli altri. Il vantaggio del modo Swift nativo è che il dizionario utilizza tipi generici, quindi se lo si definisce Intcome chiave e Stringcome valore, non è possibile utilizzare erroneamente chiavi e valori di tipi diversi. (Il compilatore controlla i tipi per tuo conto.)

Sulla base di ciò che vedo nel tuo codice, il tuo dizionario utilizza Intcome chiave e Stringcome valore. Per creare un'istanza e aggiungere un elemento in un secondo momento è possibile utilizzare questo codice:

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

Se in seguito devi assegnarlo a una variabile di NSDictionarytipo, esegui un cast esplicito:

let nsDict = dict as! NSDictionary

E, come accennato in precedenza, se si desidera passarlo a una funzione prevista NSDictionary, passarlo così com'è senza alcun cast o conversione.


Grazie per una spiegazione corretta di ciò che una persona dovrebbe effettivamente fare. Sfruttando la comodità di Swift per creare e manipolare un Dictionaryoggetto e convertirlo NSDictionaryalla fine, se necessario. Meraviglioso. Grazie.
Joshua Pinter

C'è comunque che posso aggiungere alla stessa chiave usando un delimitatore (simile a addValue ). Voglio dire come aggiungere un "Antonio"tasto 1per dic[1]tornare "abc, Antonio".
Miele

@honey non di cui sono a conoscenza ... ma è una semplice aggiunta se l'elemento esiste già
Antonio

113

puoi aggiungere usando il seguente modo e cambiare DictionaryinNSMutableDictionary

dict["key"] = "value"

2
Ho ricevuto un errore che diceCannot assign to the result of this expression
Dharmesh Kheni il

aggiungi in questo modo per la tua domanda dict [3] = "efg";
yashwanth77,

controlla la mia risposta modificata funziona per me.cambia il dizionario in quello mutevole funziona!
yashwanth77,

1
dict["testval"] = "test".. Errorefatal error: unexpectedly found nil while unwrapping an Optional value
jose920405

2
Non funzionerà con 2.2+, dict è di sola espressione in quella espressione
jeveloper il

68

So che potrebbe arrivare molto tardi, ma può rivelarsi utile a qualcuno. Quindi per aggiungere coppie di valori-chiave ai dizionari in swift, puoi usare il metodo updateValue (value:, forKey:) come segue:

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

Grazie! Continuavo a ottenere qualcosa su un parametro predefinito mancante quando stavo cercando di aggiungere nuovi valori al dict. Questo metodo ha funzionato.
Inmanl

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)

Quindi, il tuo dizionario contiene:

dizionario [1: Hola, 2: Hello, 3: Aloha]


3
In che modo è meglio di dictionary[1] = "Hola"?
Ben Leggiero,

È semplicemente un altro modo per farlo. Tutto dipende da cosa devi fare! Nel mio caso, questo è il modo migliore
Cristian Mora il

4
Capisco che pensi che sia meglio; ecco perché l'hai pubblicato. Ma non vedo come sia meglio. Per favore, dimmi come va meglio
Ben Leggiero,

Sono d'accordo che ci dovrebbe essere un metodo chiamato "addValue" o "setValue", che "updateValue" dovrebbe essere usato per AGGIORNARE come dice il nome
pkarc

Il motivo è che quando il dizionario era init ha un valore [] diverso da zero, quindi è necessario utilizzare la proprietà updateValue perché stiamo provando a cambiare il valore e non inserirlo.
Cristian Mora,

16

Se il dizionario è Inta Stringche si può fare semplicemente:

dict[3] = "efg"

Se intendi aggiungere elementi al valore del dizionario una possibile soluzione:

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

dict["key"]! += [1]
dict["key"]!.append(1)
dict["key"]?.append(1)

16

Swift 3+

Esempio per assegnare nuovi valori al dizionario. È necessario dichiararlo come NSMutableDictionary:

var myDictionary: NSMutableDictionary = [:]
let newValue = 1
myDictionary["newKey"] = newValue
print(myDictionary)

12

In Swift, se si utilizza NSDictionary , è possibile utilizzare setValue:

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

1
modificato la tua risposta, in futuro considera la possibilità di aggiungere ulteriori informazioni per evitare il downgrade.
Juan Boero,

11

Dati due dizionari come di seguito:

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

Ecco come è possibile aggiungere tutti gli elementi da dic2 a dic1 :

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

Cin cin A.


9
È meglio usare .forEachinvece .mapche non abbiamo bisogno di alcun array mappato di ritorno
haik.ampardjian,

9

Dict.updateValue aggiorna il valore per la chiave esistente dal dizionario o aggiunge una nuova nuova coppia chiave-valore se la chiave non esiste.

Esempio-

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

Risultato-

: 2 elements
    - key : "userId"
    - value : 866: 2 elements
    - key : "otherNotes"
    - value : "Hello"

7

Per i borsisti usare [String:Any]invece di Dictionarysotto è l'estensione

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

    mutating func append(anotherDict:[String:Any]) {
        for (key, value) in anotherDict {
            self.updateValue(value, forKey: key)
        }
    }
}

4

A partire da Swift 5, funziona la seguente raccolta di codici.

 // 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

Non è disponibile alcuna funzione per aggiungere i dati nel dizionario. Basta assegnare il valore alla nuova chiave nel dizionario esistente. aggiungerà automaticamente valore al dizionario.

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

L'output sarà simile

["Nome": "Aloha", "utente": "Aloha 2", "questions": "" Sei mio "?"]


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
Fornisci alcune informazioni sul perché questa risposta risolva il problema
Stephen Reindl,

@StephenReindl Se lo esegui, vedrai;)
Ben Leggiero,

1

Per aggiungere nuovi elementi basta impostare:

listParrameters["your parrameter"] = value

0

Fino ad ora il modo migliore che ho trovato per aggiungere dati a un dizionario utilizzando una delle funzioni di ordine superiore di Swift, ovvero "ridurre". Segui lo snippet di codice seguente:

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

@ Dharmesh Nel tuo caso, sarà,

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

Per favore fatemi sapere se riscontri problemi nell'uso della sintassi sopra.


0

Swift 5 happy coding

var tempDicData = NSMutableDictionary()

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

-1

Ho aggiunto l'estensione del dizionario

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

puoi usare cloneWithcosì

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

-10

se si desidera modificare o aggiornare NSDictionary, prima di tutto digitarlo come NSMutableDictionary

let newdictionary = NSDictionary as NSMutableDictionary

quindi usa semplicemente

 newdictionary.setValue(value: AnyObject?, forKey: String)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.