web-dev-qa-db-fra.com

Existe-t-il une syntaxe littérale pour les collections mutables?

Je sais que je peux créer un NSArray avec @[@"foo", @"bar"] ou NSDictionary avec @{@0 : @"foo", @1 : @"bar"}.

Existe-t-il une syntaxe littérale pour créer un NSMutableArray ou un NSMutableDictionary?

53
ma11hew28

Non. Tout comme il n'y a pas non plus de syntaxe pour créer un NSMutableString. Les objets mutables ne sont pas particulièrement adaptés aux valeurs littérales.

17
Lily Ballard

Il n'y a pas de méthode intégrée, mais j'utilise généralement mutableCopy comme ceci:

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

Mais, existe-t-il une syntaxe littérale pour créer un NSMutableArray ou un NSMutableDictionary?

Non. Meilleure alternative:

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

Oui. Mais pas tout à fait. Regarde ça;

NSMutableArray *list = [@[] mutableCopy];

Cela crée un tableau non mutable @[] et appelle mutableCopy qui renvoie un NSMutableArray *. Au lieu de @[], vous pouvez donner n'importe quel littéral de tableau.

8
nidheeshdas

Si vous avez un littéral imbriqué de tableaux et de dictionnaires, vous pouvez le transformer en une version entièrement mutable en passant par NSJSONSerialization. Par exemple:

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

C'est un peu un détour, mais au moins vous n'avez pas à écrire le code vous-même. Et la bonne chose est que NSJSONSerialization est très rapide.

3
meaning-matters