48

So che posso creare un NSArray con @[@"foo", @"bar"] o un NSDictionary con @{@0 : @"foo", @1 : @"bar"}.Esiste una sintassi letterale per le raccolte modificabili?

Esiste una sintassi letterale per la creazione di NSMutableArray o NSMutableDictionary?

+0

Semplicemente non dimenticare che il suo dizionario 'NSDictionary * = @ {@" chiave: @ "valore"}; ', potrebbe confondere con il modo in cui lo hai scritto. Diverso da ': objectsWithKeys'. –

risposta

17

No. Proprio come non esiste una sintassi per la creazione di NSMutableString. Gli oggetti mutabili non sono particolarmente adatti ai valori letterali.

+16

Dev'essere in disaccordo con quest'ultima frase. Programmando in Python, ad esempio, le collezioni vengono create letteralmente e modificabili per impostazione predefinita. Può essere molto utile. –

+0

@JoshCaswell: Python possiede persino collezioni immutabili? –

+5

Sì, ci sono cose chiamate ["tuple"] (http://docs.python.org/tutorial/datastructures.html#tuples-and-sequences) che sono immutabili. '> (1, 2, 3) # tupla (array immutabile)' '> [1, 2, 3] # lista (array mutabile)' –

95

Non c'è una costruito nel modo, ma ho appena solito uso mutableCopy come questo:

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

Questo sembra meno efficiente e non molto più breve di '[NSMutableArray arrayWithObjects: @" 1 ", @" 2 ", @" 3 ", nil]'. – ma11hew28

+8

In effetti, ma @MattDiPasquale ha richiesto una sintassi letterale ... – Anne

+1

O in alternativa: "NSMutableArray * array = [NSMutableArray arrayWithArray: @ [@" 1 ", @" 2 ", @" 3 "]];" - sebbene mi piaccia il tuo esempio :) – Marchy

17

Ma, c'è una sintassi letterale per creare un NSMutableArray o un NSMutableDictionary?

No. migliore alternativa:

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

Se si dispone di un nidificato letterale di array e dizionari, è possibile trasformare questo in una versione completamente mutevole passando attraverso NSJSONSerialization. Per esempio:

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

E 'un po' di una deviazione, ma almeno non c'è bisogno di scrivere il codice. E la cosa buona è che NSJSONSerialization è molto veloce.

+1

Uh amico, JSONKit è più veloce. Di 5 volte. Inoltre, questo è troppo tortuoso. Basta usare -mutableCopy, quindi si può usare facoltativamente -autorelease. –

+1

@NathanielSymer Andiamo amico: il readme di due anni [JSONKit] (https://github.com/johnezang/JSONKit) --wellwell ha mantenuto la roba btw-- dice che era solo il 25% - 40% più veloce. E ['-mutableCopy' fa solo una copia superficiale] (http://stackoverflow.com/questions/8661770/does-mutablecopy-make-contained-objects-mutable). L'unico modo è fare qualcosa di 'tortuoso'. –

+1

si potrebbe anche solo fare questo: [[NSMutableArray alloc] initWithArray: @ [@ "A", @ "B"]]. mi dispiace per il downvote, ma serializzare e deserializzare è folle e non funzionerà con molti tipi di oggetti. – kritzikratzi

6

Sì. Ma non del tutto. Guarda questo;

NSMutableArray *list = [@[] mutableCopy];

Questo crea una matrice non-mutabile @[] e chiede mutableCopy che restituisce un NSMutableArray *. Al posto di @[], è possibile fornire qualsiasi letterale di array.

+0

Sei a conoscenza di problemi derivanti dall'utilizzo di questo al posto della longhand? –

Problemi correlati