Bagaimana cara menambahkan elemen ke dalam kamus di Swift?


217

Saya memiliki Kamus sederhana yang didefinisikan seperti:

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

Sekarang saya ingin menambahkan elemen ke dalam kamus ini: 3 : "efg"

Bagaimana saya bisa menambahkan 3 : "efg"kamus ini?


gunakan NSMutableDictionary
Saurabh Prajapati

1
Anda yakin ingin kamus dan bukan array, karena kunci Anda sepertinya angka 1, 2 dan 3?
gnasher729

Jawaban:


240

Anda menggunakan NSDictionary. Kecuali Anda secara eksplisit membutuhkan jenis itu untuk beberapa alasan, saya sarankan menggunakan kamus Swift.

Anda dapat meneruskan kamus Swift ke fungsi apa pun yang diharapkan NSDictionarytanpa kerja ekstra, karena Dictionary<>dan saling NSDictionaryterhubung dengan mulus. Keuntungan dari cara Swift asli adalah bahwa kamus menggunakan tipe generik, jadi jika Anda mendefinisikannya dengan Intsebagai kunci dan Stringsebagai nilainya, Anda tidak dapat secara keliru menggunakan kunci dan nilai dari tipe yang berbeda. (Kompiler memeriksa jenis atas nama Anda.)

Berdasarkan apa yang saya lihat dalam kode Anda, kamus Anda menggunakan Intsebagai kunci dan Stringsebagai nilai. Untuk membuat instance dan menambahkan item di lain waktu Anda dapat menggunakan kode ini:

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

Jika nanti Anda perlu menetapkannya ke variabel NSDictionarytipe, lakukan saja pemeran eksplisit:

let nsDict = dict as! NSDictionary

Dan, seperti yang disebutkan sebelumnya, jika Anda ingin meneruskannya ke fungsi yang diharapkan NSDictionary, berikan apa adanya tanpa perubahan atau konversi.


Terima kasih atas penjelasan yang tepat tentang apa yang seharusnya dilakukan seseorang. Memanfaatkan kemudahan Swift untuk membuat dan memanipulasi Dictionaryobjek dan kemudian mengubahnya menjadi NSDictionarypada akhirnya jika Anda perlu. Hebat. Terima kasih.
Joshua Pinter

Apakah ada yang bisa saya tambahkan ke kunci yang sama menggunakan pembatas (mirip dengan addValue ). Maksud saya seperti menambahkan sebuah "Antonio"ke tombol 1sehingga dic[1]akan kembali "abc, Antonio".
Sayang

@ Sayang tidak saya sadari ... tapi ini adalah tambahan sederhana jika elemen sudah ada
Antonio

113

Anda dapat menambahkan menggunakan cara berikut dan ubah DictionarykeNSMutableDictionary

dict["key"] = "value"

2
Saya mendapat kesalahan yang mengatakanCannot assign to the result of this expression
Dharmesh Kheni

tambahkan cara ini untuk dict pertanyaan Anda [3] = "efg";
yashwanth77

periksa jawaban saya yang sudah diedit berfungsi untuk saya. ubah kamus ke Mutable yang berfungsi!
yashwanth77

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

2
Itu tidak akan berfungsi dengan 2.2+, dikt hanya dapat dibaca dalam ungkapan itu
jeveloper

67

Saya tahu ini mungkin datang sangat terlambat, tetapi mungkin terbukti bermanfaat bagi seseorang. Jadi untuk menambahkan pasangan nilai kunci ke kamus dengan cepat, Anda dapat menggunakan metode updateValue (value:, forKey:) sebagai berikut:

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)

Jadi, kamus Anda mengandung:

kamus [1: Hola, 2: Halo, 3: Aloha]


3
Bagaimana ini lebih baik daripada dictionary[1] = "Hola"?
Ben Leggiero

Ini hanyalah cara lain untuk melakukannya. Semua tergantung pada apa yang perlu Anda lakukan! Saya kasus saya, ini adalah cara terbaik
Cristian Mora

4
Saya mengerti bahwa Anda pikir ini lebih baik; itu sebabnya kamu mempostingnya. Tapi saya tidak melihat bagaimana ini lebih baik. Tolong, katakan padaku bagaimana ini lebih baik
Ben Leggiero

Saya setuju harus ada metode yang disebut "addValue" atau "setValue", bahwa "updateValue" harus digunakan untuk UPDATING seperti namanya
pkarc

Alasannya adalah bahwa ketika kamus itu init be memiliki nilai [] yang berbeda dengan nil, jadi perlu menggunakan properti updateValue karena kami mencoba mengubah nilai dan tidak memasukkannya.
Cristian Mora

16

Jika kamus Anda adalah Intuntuk Stringdapat Anda lakukan hanya:

dict[3] = "efg"

Jika Anda bermaksud menambahkan elemen ke nilai kamus solusi yang mungkin:

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

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

16

Swift 3+

Contoh untuk menetapkan nilai baru ke Kamus. Anda harus mendeklarasikannya sebagai NSMutableDictionary:

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

12

Di Swift, jika Anda menggunakan NSDictionary , Anda dapat menggunakan setValue:

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

1
mengedit jawaban Anda, di masa mendatang pertimbangkan untuk menambahkan lebih banyak info untuk menghindari downvotes.
Juan Boero

11

Diberikan dua kamus sebagai berikut:

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

Inilah cara Anda dapat menambahkan semua item dari dic2 ke dic1 :

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

Ceria A.


9
Lebih baik menggunakan .forEachdaripada .mapkarena kita tidak perlu mengembalikan array yang dipetakan
haik.ampardjian

9

Dict.updateValue memperbarui nilai untuk kunci yang ada dari kamus atau menambahkan pasangan nilai kunci baru jika kunci tidak ada.

Contoh-

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

Hasil-

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

7

Untuk orang-orang menggunakan [String:Any]bukan di Dictionarybawah ini adalah ekstensi

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

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

4

Pada Swift 5, koleksi kode berikut berfungsi.

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

Tidak ada fungsi untuk menambahkan data dalam kamus. Anda cukup menetapkan nilai terhadap kunci baru dalam kamus yang ada. itu akan secara otomatis menambah nilai ke kamus.

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

Outputnya akan seperti

["Nama": "Aloha", "pengguna": "Aloha 2", "pertanyaan": "" Apakah Anda milikku "?"]


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
Harap berikan beberapa informasi mengapa jawaban ini menyelesaikan masalah
Stephen Reindl

@StephenReindl Jika Anda menjalankannya, Anda akan melihat;)
Ben Leggiero

1

Untuk menambahkan elemen baru, cukup atur:

listParrameters["your parrameter"] = value

0

Sampai sekarang cara terbaik yang saya temukan untuk menambahkan data ke kamus dengan menggunakan salah satu fungsi tingkat tinggi Swift yaitu "mengurangi". Ikuti cuplikan kode di bawah ini:

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

@ Dharmesh Dalam kasus Anda, itu akan menjadi,

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

Harap beri tahu saya jika Anda menemukan masalah dalam menggunakan sintaks di atas.


0

Swift 5 happy coding

var tempDicData = NSMutableDictionary()

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

-1

Saya menambahkan ekstensi Kamus

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

Anda bisa menggunakan cloneWithseperti ini

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

-10

jika Anda ingin memodifikasi atau memperbarui NSDictionary maka pertama-tama typecast sebagai NSMutableDictionary

let newdictionary = NSDictionary as NSMutableDictionary

maka cukup gunakan

 newdictionary.setValue(value: AnyObject?, forKey: String)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.