48

我知道我可以用@[@"foo", @"bar"]NSDictionary@{@0 : @"foo", @1 : @"bar"}創建NSArray是否有可變集合的文字語法?

是否有創建NSMutableArrayNSMutableDictionary的字面語法?

+0

只要不要忘記它的'NSDictionary * dictionary = @ {@「key」:@「value」};',可能會讓你誤解它。與':objectsWithKeys'不同。 –

回答

17

否如同沒有創建NSMutableString的語法一樣。可變對象不是特別適合字面值。

+16

不得不不同意最後一句話。例如,用Python進行編程,默認情況下,集合的創建是字面和可變的。它可以非常方便。 –

+0

@JoshCaswell:Python甚至有不可變的集合嗎? –

+5

是的,有一些名爲[「tuples」](http://docs.python.org/tutorial/datastructures.html#tuples-and-sequences)是不可變的。 '>(1,2,3)#tuple(immutable array)''> [1,2,3]#list(可變數組)' –

95

沒有一個內置的方式,但我只是平時使用mutableCopy這樣的:

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

這似乎效率較低,並且不比'[NSMutableArray arrayWithObjects:@「1」,@「2」,@「3」,nil]'短得多。 – ma11hew28

+8

確實如此,但@MattDiPasquale要求提供字面語法... – Anne

+1

或者:「NSMutableArray * array = [NSMutableArray arrayWithArray:@ [@」1「,@」2「,@」3「]];」 - 儘管我更喜歡你的例子:) – Marchy

17

但是,有沒有創造一個NSMutableArray或一個NSMutableDictionary文字的語法?

號最好的選擇:

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

如果你有一個嵌套的字面數組和字典,你可以通過NSJSONSerialization會變成一個完全可變的版本。例如:

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]; 

這有點繞道,但至少你不必自己寫代碼。好的是,NSJSONSerialization是非常快的。

+1

呃兄弟,JSONKit速度更快。由5x。另外,這太迂迴了。只要使用-mutableCopy,那麼你可以選擇使用-autorelease。 –

+1

@NathanielSymer來吧夥計:兩歲的[JSONKit](https://github.com/johnezang/JSONKit)自述文件 - 保存好的東西btw--本身說它只有25% - 40%的速度。而['-mutableCopy'只做一個淺拷貝](http://stackoverflow.com/questions/8661770/does-mutablecopy-make-contained-objects-mutable)。唯一的辦法是做一些'迂迴'。 –

+1

你也可以這樣做:[[NSMutableArray alloc] initWithArray:@ [@「A」,@「B」]]。對於downvote感到抱歉,但序列化和反序列化是瘋狂的,並不適用於許多類型的對象。 – kritzikratzi

6

是的。但不完全。看看這個;

NSMutableArray *list = [@[] mutableCopy];

這產生了非可變數組@[]並調用mutableCopy返回一個NSMutableArray *。代替@[],你可以給任何數組字面量。

+0

您是否知道使用此代替longhand引起的任何問題? –

相關問題