2013-08-09 27 views
6

Si verificano problemi durante la creazione di nuove chiavi per un NSDictionary annidato. Ecco quello che ho fattoAggiunta di chiavi a NSDictionary nidificato

ho questo tipo di NSMutableDictionary

NSMutableDictionary *Ga=[NSMutableDictionary dictionaryWithDictionary:@{@"Node1" :@{@"SubNode11" :@40,@"SubNode12":@30}}]; 

Quali NSLogs come:

Node1 =  { 
    SubNode11 = 40; 
    SubNode12 = 30; 
}; 

Ora per aggiungere un'altra chiave principale e un tasto nidificato ho fatto questo,

[Ga setObject:@{@"SubNode21" : @555} forKey:@"Node2"]; 

Ora le uscite NSLog:

Node1 =  { 
    SubNode11 = 40; 
    SubNode12 = 30; 
}; 
Node2 =  { 
    SubNode21 = 555; 
}; 
} 

Ho bisogno di aggiungere un'altra chiave a un nodo esistente, ad esempio Sottonodo22 = 345; per Nodo2 in una riga separata del codice, così ho pensato che questo potrebbe funzionare

[[Ga objectForKey:@"Node2"] setObject:@5555 forKey:@"SubNode22"]; 

Ma questo spettacolo di errore "Terminare app a causa di eccezione non identificata 'NSInvalidArgumentException', la ragione: '- [__ NSDictionaryI setObject: Forkey:]: non riconosciuta selettore inviato all'istanza "

Non so quale sia il problema, questo metodo sembra semplice per me .. Qualsiasi soluzione per favore.

+0

'- [__NSDictionaryI setObject: forKey:]: selettore non riconosciuto inviato all'istanza' - che cosa significa? Cerca le specifiche per NSDictionary e verifica se 'setObject' è un metodo che supporta. –

risposta

8

Il problema qui non ha nulla a che fare con il nesting. Ha a che fare con il verso mutabile immutabile. Se il dizionario non è modificabile, non è possibile aggiungerlo.

Il messaggio di errore indica che lo NSDictionary non ha un metodo chiamato setObject:ForKey: perché questo è un metodo di NSMutableDictionary. L'utilizzo di nuovi dizionari letterali di Apples @{ key: object} crea solo dizionari immutabili.

Quindi quello che realmente serve è quello di assicurarsi che si sta creato NSMutableDictionary s utilizzando [NSMutableDictionary dictionaryWithObjectsAndKeys:]; o [@{ Key: Object } mutableCopy]

ecco il codice cambiato

NSMutableDictionary *subNode = [NSMutableDictionary dictionaryWithObjectsAndKeys:@40, @"SubNode11", @30, @"SubNode12", nil]; 
NSMutableDictionary *Ga = [NSMutableDictionary dictionaryWithObjectsAndKeys:subNode, @"Node 1", nil]; 
[Ga setObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:@555, @"SubNode21", nil] forKey:@"Node2"]; 
[[Ga objectForKey:@"Node2"] setObject:@5555 forKey:@"SubNode22"]; 

è ancora possibile utilizzare alcuni dei nuovi subscripting caratteristiche però. Per esempio è possibile modificare il codice per una cosa del genere questo è più leggibile fare le stesse cose:

NSMutableDictionary *Ga = [NSMutableDictionary dictionary]; 

// Create SubNodes 
NSMutableDictionary *subNode1 = [NSMutableDictionary dictionary]; 
subNode1[@"SubNode11"] = @40; 
subNode1[@"SubNode12"] = @30; 

NSMutableDictionary *subNode2 = [NSMutableDictionary dictionary]; 
subNode2[@"SubNode21"] = @555; 

// Set SubNodes to Main Node Container 
Ga[@"Node1"] = subNode1; 
Ga[@"Node2"] = subNode2; 

// Set a nested subnode's value. 
Ga[@"Node2"][@"SubNode22"] = @5555; 
+0

Grazie per la soluzione, non ho davvero notato che ho fatto dictionarywithDictionary per definire il dizionario annidato che ha causato tutto il problema. Quello che ho fatto per risolvere il problema è che ho creato un altro MutableDictionary che ha aggiunto separatamente gli oggetti e i valori del dizionario nidificato e infine aggiunto questo dizionario al dizionario originale. Ero abbastanza stupido da non capire il problema quando si lavorava sulla soluzione: P –

+0

No Problem, Happy Coding :) –

2

Il problema è che il dizionario esterno è un NSMutableDictionary, ma i vostri interni (quelli creati con solo la sintassi @{}) sono immutabili NSDictionaries. Dovrai renderli tutti modificabili in modo esplicito.

0

Il problema qui è che la sintassi del dizionario letterale (la sintassi @{...}) produce un NSDictionary - quello che effettivamente è necessario è un NSMutableDictionary. (La classe NSDictionary è immutabile, il metodo setObject:forKey: è presente solo nel NSMutableDictionary sottoclasse, ed è per questo che stai ricevendo l'eccezione.) Per risolvere il problema, è necessario fare qualcosa di simile

[Ga setObject:[NSMutableDictionary dictionaryWithDictionary:@{@"SubNode21" : @555}] 
     forKey:@"Node2"];