NSDictionary nasıl eklenir


93

A kullanıyordum NSMutableArrayve sözlük kullanmanın elde etmeye çalıştığım şey için çok daha basit olduğunu fark ettim.

Bir anahtarı sözlükte NSStringbir değeri ve bir değeri olarak kaydetmek istiyorum int. Bu nasıl yapılır? İkinci olarak, değişken ve normal sözlük arasındaki fark nedir?

Yanıtlar:


199

Bir değişken sözlük, değişmiş ekleyip kaldırma nesneler olabilir yani edilebilir. Bir değişmez , oluşturulduktan sonra sabitlenir.

oluştur ve ekle:

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

ve al:

int myNumber = [[dict objectForKey:@"A cool number"] intValue];

Bir kapasite ile mi başlamak zorundasınız yoksa dinamik olabilir mi?
muttley91

2
Başlangıç ​​kapasitesini belirtmeniz gerekmez, ancak yaparsanız performans artışı görebilirsiniz. Kaç öğe içereceğini önceden biliyorsanız, bu sayıyı veya biraz daha büyük bir değeri sağlayın.
Eiko

NSDictionary soran NSMutableDictionary değil mi?
Ananta Prasad

35

Ayarlayarak nesne setValue:(id)value forKey:(id)keyyöntemini kullanacaksınız NSMutableDictionary:

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

Veya modern Objective-C'de:

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

Değişken ve "normal" arasındaki fark, değişkenliktir. Yani , "normal" ile yapamazken NSMutableDictionary(ve NSMutableArray) içeriğini değiştirebilirsiniz NSDictionaryveNSArray


2
Bu tamsayıyı bir NSNumber ile sarmamanız gerekmez mi?
Johan Kool

Bununla ilgili bir sorunum daha var. Dize olarak kullanıcı tarafından girilen bir metni ve kullanıcının metni kaydettiği görüntü referansını (görüntü dizisindeki dizin) saklamam gerekiyor. Az önce bahsettiğim her biri için bir tane olmak üzere 2 değişkene sahip bir değişken nesne dizisini denedim. Bu, tableView'i dizi nesneleri metin değerleriyle doldurmaya çalışırken iyi çalışmıyordu. Öyleyse bir sözlük düşündüm, tek sorun, verileri indekse göre alabilirmişim gibi görünmesi, hashmap gibi bir anahtar veya değer olması gerekiyor, değil mi?
sistem

@Johan - doğru ve güncel! @alJaree - evet, sözlük bir çeşit anahtar-değer deposu. Bence senin pozisyonunda bir dizi sözlükle daha iyi olursun. Gibi bir şey[{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

Bu hala benim için işe yaramayacak, çünkü her nesneden metin almam ve bunu sık kullanılanlar UITableView'ı doldurmak için kullanmam ve ayrıca seçilen favori görüntüyü alabilmem ve görüntüleyebilmem için görüntü dizisine bir dizin referansına ihtiyacım var. Yukarıda anlattığım nesneyi denedim, ancak NSStrings dizisinden okurken döndürülen nesneleri belirli bir nedenle depolanan belirli nesneden ziyade bir nedenle denedim. Burada ne yapacağımdan emin değilim,
sistem

@ "% D _% @, index, SavedTitle gibi NSStrings'i saklamam gerekebileceğini düşünüyorum ve sonra NSString'i ayırıp ihtiyacım olanı alıp almam gerekebileceğini düşünüyorum. Java terimleriyle düşünüyorum, eminim bir obj c. :) içinde bölünme işlevi
system

16

Dizi bildirildiğinde, yalnızca anahtar / değer çiftlerini NSDictionary gibi eklememiz gerekir.

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

bu NSDictionary içerisindeki anahtar değerleri ekleyemeyiz veya kaldıramayız

NSMutableDictionary'de olduğu gibi, dizinin ilkleştirilmesinden sonra nesneleri de bu yöntemi kullanarak ekleyebiliriz

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

anahtar değerini kaldırmak için aşağıdaki kodu kullanmalıyız

[mutableDict removeObject:@"Value1" forKey:@"Key1"];

12

Sürümü güncelle

Amaç-C

Oluşturmak:

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

Değişiklik:

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

Kısa el sözdizimi denir Objective-C Literals.

Swift

Oluşturmak:

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

Değişiklik:

dictionary["myKey3"] = 3

1

Sormak istediğiniz, "değişebilir ve değiştirilemez dizi veya sözlük arasındaki fark nedir?" Zaten bildiğiniz şeyleri tanımlamak için çoğu zaman farklı terimler kullanılır. Bu durumda, "değiştirilebilir" terimini "dinamik" ile değiştirebilirsiniz. Dolayısıyla, bir karşılıklı sözlük veya dizi "dinamik" olan ve çalışma zamanında değişebilen bir sözlük veya dizi ise, değiştirilemeyen bir sözlük veya dizi "statik" olan ve kodunuzda tanımlanan ve çalışma zamanında değişmeyen bir sözlüktür (başka bir deyişle , öğeleri eklemeyecek, silmeyecek veya muhtemelen sıralamayacaksınız.)

Nasıl yapıldığına gelince, bizden buradaki belgeleri tekrar etmemizi istiyorsunuz. Tam olarak nasıl yapıldığını görmek için tek yapmanız gereken örnek kodda ve Xcode belgelerinde arama yapmaktır. Ama değişken şey ilk öğrenirken beni de şaşırttı, bu yüzden size bunu vereceğim!


Bazen Xcode belgelerinde yeterince iyi bir açıklama yoktur, her zaman değil, bazen de net örnekler olmadan derin teoriye girer. : P Evet Değişebilir (mutasyona uğrayabilir) kısmını şimdi anlıyorum. :)
system

0

Referans için, birebir olanı initWithDictionarybaşlatmak için de kullanabilirsiniz NSMutableDictionary:

NSMutableDictionary buttons = [[NSMutableDictionary alloc] initWithDictionary: @{
    @"touch": @0,
    @"app": @0,
    @"back": @0,
    @"volup": @0,
    @"voldown": @0
}];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.