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?


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.


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"

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)

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]


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)

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)

12

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

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

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.


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"

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

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)

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


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

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.


0

Swift 5 happy kodowania

var tempDicData = NSMutableDictionary()

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

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

-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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.