Jak dołączyć elementy do słownika w Swift?

217

Mam prosty słownik, który jest zdefiniowany jako:

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

Teraz chcę dodać element do tego słownika: 3 : "efg"

Jak mogę dołączyć 3 : "efg"do tego istniejącego słownika?

Dharmesh Kheni
źródło
użyj NSMutableDictionary
Saurabh Prajapati
1
Czy na pewno chcesz słownika, a nie tablicy, ponieważ twoje klucze wydają się być cyframi 1, 2 i 3?
gnasher729

Odpowiedzi:

240

Używasz NSDictionary. O ile z jakiegoś powodu nie potrzebujesz tego typu jawnie, zalecamy używanie słownika Swift.

Możesz przekazać słownik Swift do dowolnej funkcji oczekującej NSDictionarybez dodatkowej pracy, ponieważ Dictionary<>i NSDictionarypłynnie się ze sobą łączą. Zaletą natywnego sposobu szybkiego jest to, że słownik używa typów ogólnych, więc jeśli zdefiniujesz go Intjako klucz i Stringjako wartość, nie możesz omyłkowo użyć kluczy i wartości różnych typów. (Kompilator sprawdza typy w Twoim imieniu).

W oparciu o to, co widzę w twoim kodzie, twój słownik używa Intjako klucza i Stringwartości. Aby utworzyć instancję i dodać element w późniejszym czasie, możesz użyć tego kodu:

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

Jeśli później musisz przypisać ją do zmiennej NSDictionarytypu, po prostu wykonaj jawną rzutowanie:

let nsDict = dict as! NSDictionary

I, jak wspomniano wcześniej, jeśli chcesz przekazać ją do funkcji oczekującej NSDictionary, przekaż ją taką, jaka jest, bez rzutowania ani konwersji.

Antonio
źródło
Dzięki za właściwe wyjaśnienie, co dana osoba powinna zrobić. Wykorzystując wygodę Swift do tworzenia i manipulowania Dictionaryobiektem, a następnie przekształcania go NSDictionaryna końcu, jeśli zajdzie taka potrzeba. Wspaniale. Dzięki.
Joshua Pinter
Czy w każdym razie mogę dołączyć do tego samego klucza za pomocą separatora (podobnego do addValue ). Znaczy jak dodać"Antonio" do klucza 1tak dic[1]wróci "abc, Antonio".
Kochanie,
@ kochanie, nie jestem tego świadom ... ale to prosty dodatek, jeśli element już istnieje
Antonio
113

możesz dodać w następujący sposób i zmienić DictionarynaNSMutableDictionary

dict["key"] = "value"
yashwanth77
źródło
2
Mam błąd, który mówiCannot assign to the result of this expression
Dharmesh Kheni,
dodaj ten sposób do pytania dict [3] = "efg";
yashwanth77
sprawdź moją zredagowaną odpowiedź, działa dla mnie. zmień słownik na Mutable, który działa!
yashwanth77
1
dict["testval"] = "test".. Błądfatal error: unexpectedly found nil while unwrapping an Optional value
jose920405,
2
Nie będzie działać z
wersją 2.2+, dykt
67

Wiem, że to może nadejść bardzo późno, ale może się komuś przydać. W celu szybkiego dołączenia par wartości klucza do słowników można użyć metody updateValue (wartość:, forKey:) w następujący sposób:

var dict = [ 1 : "abc", 2 : "cde"]
dict.updateValue("efg", forKey: 3)
print(dict)
HeadOnn
źródło
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)

Twój słownik zawiera:

słownik [1: Hola, 2: Hello, 3: Aloha]

Cristian Mora
źródło
3
Jak to jest lepsze niż dictionary[1] = "Hola"?
Ben Leggiero,
To po prostu inny sposób na zrobienie tego. Wszystko zależy od tego, co musisz zrobić! W moim przypadku jest to najlepszy sposób
Cristian Mora,
4
Rozumiem, że uważasz, że tak jest lepiej; dlatego to opublikowałeś. Ale nie rozumiem, jak to jest lepsze. Proszę, powiedz mi, jak to jest lepsze
Ben Leggiero,
Zgadzam się, że powinna istnieć metoda o nazwie „addValue” lub „setValue”, że „updateValue” powinien być używany do AKTUALIZACJI, jak sama nazwa wskazuje
pkarc
Powodem jest to, że kiedy słownik był inicjowany, ma wartość [] inną niż zero, więc konieczne jest użycie właściwości updateValue, ponieważ próbujemy zmienić wartość, a nie wstawić ją.
Cristian Mora,
16

Jeśli słownik jest Int, aby Stringmożna zrobić po prostu:

dict[3] = "efg"

Jeśli chodzi o dodanie elementów do wartości słownika, możliwe rozwiązanie:

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

dict["key"]! += [1]
dict["key"]!.append(1)
dict["key"]?.append(1)
Alex Gidan
źródło
16

Swift 3+

Przykład przypisywania nowych wartości do słownika. Musisz zadeklarować go jako NSMutableDictionary:

var myDictionary: NSMutableDictionary = [:]
let newValue = 1
myDictionary["newKey"] = newValue
print(myDictionary)
Dasoga
źródło
12

W Swift, jeśli używasz NSDictionary , możesz użyć setValue:

dict.setValue("value", forKey: "key")
lojals
źródło
1
zredagowałeś swoją odpowiedź, w przyszłości rozważ dodanie dodatkowych informacji, aby uniknąć negatywnych opinii.
Juan Boero,
11

Biorąc pod uwagę dwa słowniki, jak poniżej:

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

Oto jak możesz dodać wszystkie elementy z dic2 do dic1 :

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

Pozdrawiam A.

Amin Tavassolian
źródło
9
Lepiej jest użyć .forEachzamiast, .mapponieważ nie potrzebujemy żadnej odwzorowanej tablicy
odwrotnej
9

Dict.updateValue aktualizuje wartość istniejącego klucza ze słownika lub dodaje nową nową parę klucz-wartość, jeśli klucz nie istnieje.

Przykład-

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

Wynik-

: 2 elements
    - key : "userId"
    - value : 866: 2 elements
    - key : "otherNotes"
    - value : "Hello"
Varsha Gaikwad
źródło
7

Dla stypendystów używających [String:Any]zamiast Dictionaryniżej jest to rozszerzenie

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
źródło
4

Począwszy od wersji Swift 5, działa następująca kolekcja kodów.

 // 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
źródło
4

Nie ma funkcji dodawania danych do słownika. Po prostu przypisujesz wartość do nowego klucza w istniejącym słowniku. automatycznie doda wartość do słownika.

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

Wynik będzie podobny

[„Imię”: „Aloha”, „użytkownik”: „Aloha 2”, „pytania”: „„ Czy jesteś mój ”?]]

Talha Rasool
źródło
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
źródło
2
var dict = ["name": "Samira", "surname": "Sami"]
// Add a new enter code herekey with a value
dict["email"] = "[email protected]"
print(dict)
Królowa Semiramis
źródło
1
Proszę podać informacje, dlaczego ta odpowiedź rozwiązuje problem
Stephen Reindl
@StephenReindl Jeśli go uruchomisz, zobaczysz;)
Ben Leggiero,
1

Aby dodać nowe elementy, ustaw:

listParrameters["your parrameter"] = value
Tung Tran
źródło
0

Do tej pory najlepszym sposobem na dołączenie danych do słownika jest użycie jednej z funkcji Swift wyższego rzędu, tj. „Zmniejszanie”. Wykonaj poniższy fragment kodu:

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

@ Dharmesh W twoim przypadku będzie to

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

Daj mi znać, jeśli znajdziesz jakiekolwiek problemy z używaniem powyższej składni.

Shobhit C.
źródło
0

Swift 5 happy kodowania

var tempDicData = NSMutableDictionary()

for temp in answerList {
    tempDicData.setValue("your value", forKey: "your key")
}
Shakeel Ahmed
źródło
-1

Dodałem rozszerzenie słownika

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

możesz użyć w cloneWithten sposób

 newDictionary = dict.reduce([3 : "efg"]) { r, e in r.cloneWith(e) }
jimi
źródło
-10

jeśli chcesz zmodyfikować lub zaktualizować NSDictionary, to przede wszystkim wpisz go jako NSMutableDictionary

let newdictionary = NSDictionary as NSMutableDictionary

następnie po prostu użyj

 newdictionary.setValue(value: AnyObject?, forKey: String)
Sonu Verma
źródło