Wie füge ich Elemente in Swift in ein Wörterbuch ein?


216

Ich habe ein einfaches Wörterbuch, das wie folgt definiert ist:

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

Jetzt möchte ich diesem Wörterbuch ein Element hinzufügen: 3 : "efg"

Wie kann ich 3 : "efg"dieses vorhandene Wörterbuch anhängen ?


benutze NSMutableDictionary
Saurabh Prajapati

1
Sind Sie sicher, dass Sie ein Wörterbuch und kein Array möchten, da Ihre Schlüssel die Zahlen 1, 2 und 3 zu sein scheinen?
Gnasher729

Antworten:


239

Du benutzt NSDictionary. Sofern Sie aus irgendeinem Grund nicht ausdrücklich diesen Typ benötigen, empfehle ich die Verwendung eines Swift-Wörterbuchs.

Sie können ein Swift-Wörterbuch an jede Funktion übergeben, die NSDictionaryohne zusätzliche Arbeit erwartet wird , da Dictionary<>und NSDictionarynahtlos miteinander verbunden werden. Der Vorteil der nativen Swift-Methode besteht darin, dass das Wörterbuch generische Typen verwendet. Wenn Sie es also Intals Schlüssel und Stringals Wert definieren, können Sie nicht fälschlicherweise Schlüssel und Werte verschiedener Typen verwenden. (Der Compiler überprüft die Typen in Ihrem Namen.)

Basierend auf dem, was ich in Ihrem Code sehe, wird Ihr Wörterbuch Intals Schlüssel und Stringals Wert verwendet. Um eine Instanz zu erstellen und ein Element zu einem späteren Zeitpunkt hinzuzufügen, können Sie diesen Code verwenden:

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

Wenn Sie es später einer Variablen vom NSDictionaryTyp zuweisen müssen, führen Sie einfach eine explizite Umwandlung durch:

let nsDict = dict as! NSDictionary

Wenn Sie es, wie bereits erwähnt, an eine erwartete Funktion übergeben möchten, übergeben Sie es unverändert NSDictionaryohne Umwandlung oder Konvertierung.


Vielen Dank für eine angemessene Erklärung, was eine Person eigentlich tun sollte. Nutzen Sie die Bequemlichkeit von Swift, um ein DictionaryObjekt zu erstellen, zu bearbeiten und NSDictionarybei Bedarf am Ende zu konvertieren . Wunderbar. Vielen Dank.
Joshua Pinter

Gibt es sowieso, dass ich mit einem Trennzeichen (ähnlich wie addValue ) an denselben Schlüssel anhängen kann ? Ich meine, ich möchte einen Schlüssel hinzufügen"Antonio" , 1um dic[1]zurückzukehren "abc, Antonio".
Honig

@honey nicht, dass ich weiß ... aber es ist ein einfacher Anhang, wenn das Element bereits vorhanden ist
Antonio

113

Sie können mit der folgenden Art und Weise und Änderung hinzufügen DictionaryzuNSMutableDictionary

dict["key"] = "value"

2
Ich habe einen Fehler bekommen, der besagtCannot assign to the result of this expression
Dharmesh Kheni

füge diesen Weg für deine Frage hinzu dict [3] = "efg";
Yashwanth77

Überprüfen Sie meine bearbeitete Antwort, die für mich funktioniert. Ändern Sie das Wörterbuch in eine veränderbare, die funktioniert!
Yashwanth77

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

2
Es wird nicht mit 2.2+ funktionieren, Diktat ist nur in diesem Ausdruck
lesbar

67

Ich weiß, dass dies sehr spät kommen könnte, aber es kann sich für jemanden als nützlich erweisen. Um also schnell Schlüsselwertpaare an Wörterbücher anzuhängen , können Sie die Methode updateValue (value :, forKey :) wie folgt verwenden:

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)

Ihr Wörterbuch enthält also:

Wörterbuch [1: Hola, 2: Hallo, 3: Aloha]


3
Wie ist das besser als dictionary[1] = "Hola"?
Ben Leggiero

Ist einfach ein anderer Weg, es zu tun. Alles hängt davon ab, was Sie tun müssen! Ich mein Fall, das ist der beste Weg
Cristian Mora

4
Ich verstehe, dass Sie denken, dass dies besser ist; Deshalb hast du es gepostet. Aber ich sehe nicht, wie das besser ist. Bitte sagen Sie mir, wie das besser ist
Ben Leggiero

Ich bin damit einverstanden, dass es eine Methode namens "addValue" oder "setValue" geben sollte, dass "updateValue" für UPDATING verwendet werden sollte, wie der Name schon sagt
pkarc

Der Grund dafür ist, dass bei der Initialisierung des Wörterbuchs be be einen Wert [] hat, der sich von nil unterscheidet. Verwenden Sie daher unbedingt die Eigenschaft updateValue, da wir versuchen, den Wert zu ändern und nicht einzufügen.
Cristian Mora

16

Wenn Ihr Wörterbuch ist Int, Stringkönnen Sie einfach tun:

dict[3] = "efg"

Wenn Sie dem Wert des Wörterbuchs Elemente hinzufügen möchten, ist dies eine mögliche Lösung:

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

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

16

Swift 3+

Beispiel zum Zuweisen neuer Werte zum Wörterbuch. Sie müssen es als NSMutableDictionary deklarieren:

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

12

Wenn Sie in Swift NSDictionary verwenden , können Sie Folgendes verwenden setValue:

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

1
Wenn Sie Ihre Antwort bearbeitet haben, sollten Sie in Zukunft weitere Informationen hinzufügen, um Abstimmungen zu vermeiden.
Juan Boero

11

Gegeben zwei Wörterbücher wie folgt:

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

So können Sie alle Elemente von dic2 zu dic1 hinzufügen :

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

Prost A.


9
Es ist besser , zu verwenden , .forEachanstatt , .mapwie wir brauchen keine Rückkehr abgebildet Array
haik.ampardjian

9

Dict.updateValue Aktualisiert den Wert für den vorhandenen Schlüssel aus dem Wörterbuch oder fügt ein neues neues Schlüssel-Wert-Paar hinzu, wenn der Schlüssel nicht vorhanden ist.

Beispiel-

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

Ergebnis-

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

7

Für die Fellows, die [String:Any]anstelle von Dictionaryunten verwenden, ist die Erweiterung

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

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

4

Ab Swift 5 funktioniert die folgende Codesammlung.

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

Es gibt keine Funktion zum Anhängen der Daten im Wörterbuch. Sie weisen den Wert nur dem neuen Schlüssel im vorhandenen Wörterbuch zu. Das Wörterbuch wird automatisch aufgewertet.

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

Die Ausgabe wird wie folgt sein

["Name": "Aloha", "Benutzer": "Aloha 2", "Fragen": "" Bist du mein "?"]


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
Bitte geben Sie einige Informationen an, warum diese Antwort das Problem löst
Stephen Reindl

@ StephenReindl Wenn Sie es ausführen, werden Sie sehen;)
Ben Leggiero

1

Um neue Elemente hinzuzufügen, setzen Sie einfach:

listParrameters["your parrameter"] = value

0

Bis jetzt habe ich am besten herausgefunden, wie ich Daten an ein Wörterbuch anhänge, indem ich eine der Funktionen höherer Ordnung von Swift verwende, dh "reduzieren". Folgen Sie dem folgenden Code-Snippet:

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

@ Dharmesh In deinem Fall wird es sein,

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

Bitte lassen Sie mich wissen, wenn Sie Probleme bei der Verwendung der obigen Syntax finden.


0

Swift 5 Happy Coding

var tempDicData = NSMutableDictionary()

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

-1

Ich habe die Wörterbucherweiterung hinzugefügt

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

Sie verwenden können , cloneWithwie diese

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

-10

Wenn Sie NSDictionary ändern oder aktualisieren möchten, geben Sie es zunächst als NSMutableDictionary ein

let newdictionary = NSDictionary as NSMutableDictionary

dann einfach benutzen

 newdictionary.setValue(value: AnyObject?, forKey: String)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.