web-dev-qa-db-ja.com

可変コレクションのリテラル構文はありますか?

@[@"foo", @"bar"]NSArrayを作成したり、@{@0 : @"foo", @1 : @"bar"}NSDictionaryを作成したりできることはわかっています。

NSMutableArrayまたはNSMutableDictionaryを作成するためのリテラル構文はありますか?

53
ma11hew28

いいえ。NSMutableStringを作成するための構文もないのと同じです。可変オブジェクトは、リテラル値には特に適していません。

17
Lily Ballard

組み込みの方法はありませんが、通常は次のようにmutableCopyを使用します。

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

しかし、NSMutableArrayまたはNSMutableDictionaryを作成するためのリテラル構文はありますか?

いいえ。最善の代替手段:

[@[ @"foo", @"bar"] mutableCopy]
17
Anne

はい。しかし、そうではありません。これを見てください;

NSMutableArray *list = [@[] mutableCopy];

これにより、変更不可能な配列@[]が作成され、mutableCopyが呼び出され、NSMutableArray *が返されます。 @[]の代わりに、任意の配列リテラルを指定できます。

8
nidheeshdas

配列と辞書のネストされたリテラルがある場合、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が非常に高速であることです。

3
meaning-matters