2009-11-19 24 views
66

NSDictionary kullanmak istediğim bir uygulama geliştiriyorum. Verileri mükemmel bir örnekle saklamak için bana NSDictionary'u nasıl kullanacağımı açıklayan örnek bir kod gönderebilir miyim?Bir NSDictionary içine nasıl kaydedebiliriz? NSDictionary ve NSMutableDictionary arasındaki fark nedir?

+52

... – stefanB

+7

kibar RTFMs nasılsa açık olanlardan daha yakıcı görünüyor. –

+1

@stefanB Pek çok yeni programcı için resmi belgeler genellikle çok karmaşık ve kafa karıştırıcıdır, bu yüzden SO üzerinde _x_ ile ilgili basit bir görünüm yardımcı olur. –

cevap

189

NSDictionary ve NSMutableDictionary dokümanlar muhtemelen en iyi bahis vardır. Hatta yineleme ... Bir NSDictionary

NSArray *keys = [NSArray arrayWithObjects:@"key1", @"key2", nil]; 
NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", nil]; 
NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects 
                 forKeys:keys];

oluşturmak ... gibi çeşitli şeyler yapmak için bazı büyük örnekler ...

var üzerinde o

for (id key in dictionary) { 
    NSLog(@"key: %@, value: %@", key, [dictionary objectForKey:key]); 
}

... bunu düzeltin

NSMutableDictionary *mutableDict = [dictionary mutableCopy];

Not: tarihi sürüm öncesi 2010: [[Sözlük mutableCopy] sallanmasını]

... ve

[mutableDict setObject:@"value3" forKey:@"key3"];

... sonra bir dosyaya alanına kaydetmek değiştirebilir

[mutableDict writeToFile:@"path/to/file" atomically:YES];

... ve aga geri okumak

NSMutableDictionary *anotherDict = [NSMutableDictionary dictionaryWithContentsOfFile:@"path/to/file"];

yılında ... kilit

if ([anotherDict objectForKey:@"key999"] == nil) NSLog(@"that key is not there"); 

varsa ... at ... Bir değer

NSString *x = [anotherDict objectForKey:@"key1"]; 

okumak korkutucu fütüristik sözdizimi kullanmak

itibaren

aslında sadece dicti yazabilirsiniz ziyade [dict objectForKey: @ "anahtar"] [ "anahtar" @]

+0

Üzgünüz, bu son yorum biraz sarsıcıydı. İşaret ettiğin için teşekkürler. – Tim

+0

Görmedim, sen iyisin! :) – jtbandes

+0

Doğru ... Bir sızıntı oldu –

32
NSDictionary *dict = [NSDictionary dictionaryWithObject: @"String" forKey: @"Test"]; 
NSMutableDictionary *anotherDict = [NSMutableDictionary dictionary]; 

[anotherDict setObject: dict forKey: "sub-dictionary-key"]; 
[anotherDict setObject: @"Another String" forKey: @"another test"]; 

NSLog(@"Dictionary: %@, Mutable Dictionary: %@", dict, anotherDict); 

// now we can save these to a file 
NSString *savePath = [@"~/Documents/Saved.data" stringByExpandingTildeInPath]; 
[anotherDict writeToFile: savePath atomically: YES]; 

//and restore them 
NSMutableDictionary *restored = [NSDictionary dictionaryWithContentsOfFile: savePath]; 
+0

İyi Açıklama. Yardımcı oldu .. –

+0

@Ben Gottlieb Part One: Güzel açıklamalar için teşekkürler. Aslında iki UItextField veriyi MutableDictionary dosyasındaki bir dosyada kaydetmek istiyorum. Burada 'NSString * savePath = [@ "~/Documents/Saved.data" stringByExpandingTildeInPath] yazdınız; şimdi, sorum şu, burada 'Saved.data' dosyası nedir? Nasıl yapabilirim? – Tulon

+0

@Ben Gottlieb Part Two: Ve benim durumumda aşağıdaki dosyaya bir metin dosyası (.rtf) koydum 'Dosyaları Destekleme> MediaFiles> Belgeler> userData.rtf'.Şimdi bu Mutabledictionary türünü metin dosyasına kaydedebilir miyim? ? Ve bu durumda mükemmel dizin ne olacak? Bu [userData writeToFile: @ "MediaFiles/Documents/userData.rtf atomik olarak: EVET] ile çalışıyordum; & bununla birlikte [userData writeToFile: @" Belgeler/userData.rtf "atomically: YES]; işe yaramadı İyi günler. – Tulon

18

temel fark: NSMutableDictionary NSDictionary olamaz, yerinde değiştirilebilir. Bu, Kakao'daki diğer tüm NSMutable * sınıfları için geçerlidir. NSMutableDictionary, NSDictionary'ın bir alt sınıfı olan'dur, bu yüzden NSDictionary ile yapabileceğiniz her şeyi her ikisiyle de yapabilirsiniz. Bununla birlikte, NSMutableDictionary ayrıca, setObject:forKey: yöntemi gibi, yerinde değişiklik yapmak için tamamlayıcı yöntemler de ekler.

Böyle ikisi arasında dönüştürebilirsiniz:

NSMutableDictionary *mutable = [[dict mutableCopy] autorelease]; 
NSDictionary *dict = [[mutable copy] autorelease]; 

Tahminen bir dosyaya yazarak veri depolamak istiyor.karşılık gelen bir yöntem var,

BOOL success = [dict writeToFile:@"/file/path" atomically:YES]; 

bir dosyadan bir sözlük okumak için: NSDictionary (ayrıca NSMutableDictionary ile çalışır) bunu yapmanın bir yöntemi vardır

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:@"/file/path"]; 

siz dosyayı okumak istiyorsanız bir NSMutableDictionary bunu kullanın: Sen NSDictionary belgelerine bir göz alarak başlayabileceğini

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:@"/file/path"]; 
+0

Cevabınız için teşekkürler ... –