Bagaimana menambahkan ke NSDictionary

93

Saya menggunakan a NSMutableArraydan menyadari bahwa menggunakan kamus jauh lebih sederhana untuk apa yang saya coba capai.

Saya ingin menyimpan kunci sebagai NSStringdan nilai sebagai intdalam kamus. Bagaimana ini dilakukan? Kedua, apa perbedaan antara mutable dan kamus normal?

sistem
sumber

Jawaban:

199

Sebuah bisa berubah kamus dapat diubah, yaitu Anda dapat menambahkan dan benda-benda menghapus. Sebuah abadi adalah tetap setelah dibuat.

buat dan tambahkan:

NSMutableDictionary *dict = [[NSMutableDictionary alloc]initWithCapacity:10];
[dict setObject:[NSNumber numberWithInt:42] forKey:@"A cool number"];

dan ambil:

int myNumber = [[dict objectForKey:@"A cool number"] intValue];
Eiko
sumber
Apakah Anda harus memulai dengan kapasitas, atau dapatkah hanya dinamis?
muttley91
2
Anda tidak perlu menentukan kapasitas awal, tetapi Anda mungkin melihat peningkatan kinerja jika melakukannya. Jika Anda tahu sebelumnya berapa banyak item yang akan dikandungnya, berikan nomor ini atau nilai yang sedikit lebih besar.
Eiko
meminta NSDictionary bukan NSMutableDictionary?
Ananta Prasad
35

Dengan mengatur Anda akan menggunakan setValue:(id)value forKey:(id)keymetode NSMutableDictionaryobjek:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:[NSNumber numberWithInt:5] forKey:@"age"];

Atau dalam Objective-C modern:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
dict[@"age"] = @5;

Perbedaan antara bisa berubah dan "normal" adalah, yah, bisa berubah. Yaitu Anda dapat mengubah konten NSMutableDictionary(dan NSMutableArray) sementara Anda tidak dapat melakukannya dengan "normal" NSDictionarydanNSArray

Eimantas
sumber
2
Tidakkah seharusnya Anda membungkus integer itu dalam NSNumber?
Johan Kool
Saya punya satu masalah lagi dengan ini. Saya perlu menyimpan teks yang dimasukkan pengguna sebagai string serta referensi gambar (indeks dalam larik gambar) tempat pengguna menyimpan teks tersebut. Saya mencoba mutableArray objek yang memiliki 2 variabel, satu untuk masing-masing yang baru saja saya sebutkan. yang tidak berfungsi dengan baik saat mencoba mengisi tableView dengan nilai teks objek array. JADI saya memikirkan kamus, satu-satunya masalah adalah sepertinya saya dapat mengambil data dengan indeks, itu harus menjadi kunci atau nilai seperti hashmap, bukan?
sistem
@Johan - benar dan diperbarui! @alJaree - ya, kamus adalah semacam penyimpan nilai kunci. Saya pikir di posisi Anda, Anda akan lebih baik dengan berbagai kamus. Sesuatu seperti[{image: "/path/to/img/1.jpg", data: "foo bar 1"}, {image: "/path/to/img/2.jpg", data: "foo bar 2"}, ..., {image: "/path/to/img/N.jpg", data: "foo bar N"}]
Eimantas
Ini masih tidak berfungsi untuk saya, karena saya perlu mengambil teks dari setiap objek dan menggunakannya untuk mengisi UITableView favorit serta saya memerlukan referensi indeks ke array gambar sehingga saya dapat mengambil dan menampilkan gambar favorit yang dipilih. Saya mencoba objek yang saya jelaskan di atas, tetapi objek yang dikembalikan saat membaca dari array di mana NSStrings untuk beberapa alasan daripada objek spesifik yang disimpan. Saya tidak yakin apa yang harus dilakukan di sini,
sistem
Saya berpikir bahwa saya mungkin hanya perlu menyimpan NSString seperti @ "% d _% @, index, storedTitle dan kemudian hanya membagi NSString dan mengambil dan mencelupkan apa yang saya perlukan. Saya berpikir dalam istilah java, pasti ada fungsi split di obj c. :)
sistem
16

Kapan pun array dideklarasikan, maka hanya kita yang harus menambahkan nilai kunci di NSDictionary like

NSDictionary *normalDict = [[NSDictionary alloc]initWithObjectsAndKeys:@"Value1",@"Key1",@"Value2",@"Key2",@"Value3",@"Key3",nil];

kami tidak dapat menambah atau menghapus nilai kunci dalam NSDictionary ini

Sedangkan di NSMutableDictionary kita dapat menambahkan objek setelah inisialisasi array juga dengan menggunakan metode ini

NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc]init];'
[mutableDict setObject:@"Value1" forKey:@"Key1"];
[mutableDict setObject:@"Value2" forKey:@"Key2"];
[mutableDict setObject:@"Value3" forKey:@"Key3"];

untuk menghapus nilai kunci kita harus menggunakan kode berikut

[mutableDict removeObject:@"Value1" forKey:@"Key1"];
Madhu
sumber
12

Perbarui versi

Objective-C

Membuat:

NSDictionary *dictionary = @{@"myKey1": @7, @"myKey2": @5}; 

Perubahan:

NSMutableDictionary *mutableDictionary = [dictionary mutableCopy];     //Make the dictionary mutable to change/add
mutableDictionary[@"myKey3"] = @3;

Sintaks pendek disebut Objective-C Literals.

Cepat

Membuat:

var dictionary = ["myKey1": 7, "myKey2": 5]

Perubahan:

dictionary["myKey3"] = 3
Warif Akhand Rishi
sumber
1

Anda ingin bertanya adalah "apa perbedaan antara array atau kamus yang bisa berubah dan yang tidak bisa diubah." Seringkali ada istilah berbeda yang digunakan untuk menggambarkan hal-hal yang sudah Anda ketahui. Dalam kasus ini, Anda dapat mengganti istilah "bisa berubah" dengan "dinamis." Jadi, kamus atau larik yang dapat diperbaiki adalah kamus atau larik yang "dinamis" dan dapat berubah saat runtime, sedangkan kamus atau larik yang tidak dapat diubah adalah kamus atau larik yang "statis" dan ditentukan dalam kode Anda dan tidak berubah saat waktu proses (dengan kata lain , Anda tidak akan menambah, menghapus atau mungkin menyortir elemen.)

Mengenai cara melakukannya, Anda meminta kami mengulangi dokumentasi di sini. Yang perlu Anda lakukan adalah mencari kode sampel dan dokumentasi Xcode untuk melihat secara tepat bagaimana hal itu dilakukan. Tapi hal yang bisa berubah itu juga menghantamku ketika aku baru belajar, jadi aku akan memberimu yang itu!

Mark Hernandez
sumber
Terkadang tidak ada penjelasan yang cukup layak tentang dokumen Xcode, ini masuk ke teori yang mendalam tanpa contoh yang jelas, tidak selalu, tapi terkadang. : P Ya saya mengerti bagian yang bisa berubah (bisa bermutasi) sekarang terima kasih. :)
sistem
0

Sebagai referensi, Anda juga dapat menggunakan initWithDictionaryto init NSMutableDictionarydengan literal:

NSMutableDictionary buttons = [[NSMutableDictionary alloc] initWithDictionary: @{
    @"touch": @0,
    @"app": @0,
    @"back": @0,
    @"volup": @0,
    @"voldown": @0
}];
Topher Fangio
sumber