48

ben @[@"foo", @"bar"] ile NSArray veya @{@0 : @"foo", @1 : @"bar"} ile NSDictionary oluşturabilir biliyorum.Değişebilir koleksiyonlar için bir söz dizimi var mı?

NSMutableArray veya NSMutableDictionary oluşturmak için bir sözdizimi var mı? Sadece ya bir NSMutableString oluşturmak için bir sözdizimi olmadığı nasıl olarak

+0

Sadece unutma ki onun 'NSDictionary * Sözlük = @ { "anahtar" @ "değeri" @};', yolu o yazdım o ile kafa karıştırıcı olabilir. 'NesneleriWithKeys'den farklı. –

cevap

17

sayılı. Değişebilen nesneler, özellikle literal değerler için uygun değildir.

+16

Bu son cümleye katılmamak gerekir. Python'da programlama, örneğin, koleksiyonlar tam anlamıyla oluşturulabilir ve varsayılan olarak değiştirilebilir. Çok kullanışlı olabilir. –

+0

@JoshCaswell: Python'un bile değişmez koleksiyonları var mı? –

+5

Evet, immutable olan ["tuples"] (http://docs.python.org/tutorial/datastructures.html#tuples-and-sequences) adı verilen şeyler var. '> (1, 2, 3) # tuple (değişmez dizi)' '> [1, 2, 3] # liste (mutable dizi)' –

95

Orada bir şekilde inşa, ama sadece genellikle böyle mutableCopy kullanmak değildir:

NSMutableArray *array = [@[ @"1", @"2", @"3" ] mutableCopy]; 
+3

Bu, daha az verimli ve 'fazla olmayan daha kısa görünmektedir [NSMutableArray arrayWithObjects: "1"', 2 "" ', "3", sıfır @] '. – ma11hew28

+8

Gerçekten, ama @MattDiPasquale alternatif olarak bir hazır sözdizimi ... – Anne

+1

ya istedi: "NSMutableArray * dizi = [NSMutableArray arrayWithArray: @ [@" 2 ', "1" ",' "3"]];" - Ben seni örnek gibi olsa daha iyi :) – Marchy

17

Fakat, bir NSMutableArray veya NSMutableDictionary oluşturmak için bir hazır sözdizimi var mı?

sayılı İyi Alternatif: Eğer diziler ve sözlüklerde bir iç içe edebi varsa

[@[ @"foo", @"bar"] mutableCopy] 
4

, sen NSJSONSerialization geçerek tam değişken sürümü içine bu açabilirsiniz. Örneğin:

NSArray* array = @[ @{ @"call" : @{ @"devices" : @[ @"$(devices)" ] } } ]; 
NSData* data = [NSJSONSerialization dataWithJSONObject:array 
               options:0 
                error:nil]; 

NSJSONReadingOptions options = NSJSONReadingMutableContainers | 
           NSJSONReadingMutableLeaves; 
NSMutableArray* mutableArray = [NSJSONSerialization JSONObjectWithData:data 
                   options:options 
                   error:nil]; 

Bir sapmanın biraz, ama en azından kodu kendiniz yazmak gerekmez. Ve iyi olan şey, NSJSONSerialization'un çok hızlı olmasıdır.

+1

Uh dude, JSONKit daha hızlıdır. 5x tarafından. Ayrıca, bu çok dolambaçlı. Sadece -mutableCopy kullanın, daha sonra isteğe bağlı olarak -autorelease kullanabilirsiniz. –

+1

adama gel @NathanielSymer: kendisi sadece% 25 olduğunu söylüyor btw-- iki yaşında [JSONKit] (https://github.com/johnezang/JSONKit) benioku şeyler muhafaza --well -% 40 daha hızlı. Ve [ '-mutableCopy' sadece sığ bir kopyasını yapar] (http://stackoverflow.com/questions/8661770/does-mutablecopy-make-contained-objects-mutable). Tek yol 'dolaşım' bir şey yapmaktır. –

+1

da bunu yapabilirsiniz: [[NSMutableArray alloc] initWithArray: @ [@ "A", @ "B"]]. downvote için üzgünüm, ama serileştirme ve serpiştirme zahmetli ve birçok nesne türüyle çalışmayacak. – kritzikratzi

6

Evet. Ama tam olarak değil. Şuna bir bak;

NSMutableArray *list = [@[] mutableCopy];

Bu olmayan bir değişken dizi @[] oluşturur ve bir NSMutableArray * döner mutableCopy çağırır. @[] yerine, herhangi bir dizi literal verebilirsiniz.

+0

Longhand yerine bunun kullanılmasından kaynaklanan herhangi bir sorun var mı? –

İlgili konular