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?

Dharmesh Kheni
sumber
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.

Antonio
sumber
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"
yashwanth77
sumber
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)
HeadOnn
sumber
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]

Cristian Mora
sumber
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)
Alex Gidan
sumber
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)
Dasoga
sumber
12

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

dict.setValue("value", forKey: "key")
Lojals
sumber
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.

Amin Tavassolian
sumber
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"
Varsha Gaikwad
sumber
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)
        }
    }
}
Dhaval H. Nena
sumber
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)
Tuan Anubis
sumber
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 "?"]

Talha Rasool
sumber
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
sumber
2
var dict = ["name": "Samira", "surname": "Sami"]
// Add a new enter code herekey with a value
dict["email"] = "[email protected]"
print(dict)
Ratu Semiramis
sumber
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
Tung Tran
sumber
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.

Shobhit C
sumber
0

Swift 5 happy coding

var tempDicData = NSMutableDictionary()

for temp in answerList {
    tempDicData.setValue("your value", forKey: "your key")
}
Shakeel Ahmed
sumber
-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) }
jimi
sumber
-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)
Sonu Verma
sumber