2010-01-21 2 views
57

OK, sono un po 'confuso. Probabilmente è solo una banalità.dizionario Objective-C che inserisce BOOL

Ho una funzione che sembra qualcosa di simile:

- (void)getNumbersForNews:(BOOL)news andMails:(BOOL)mails { 
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; 
[parameters setValue:news forKey:@"getNews"]; 
[parameters setValue:mails forKey:@"getMails"];...} 

Non importa se io uso setValue:forKey: o setObject:ForKey:, sto ottenendo sempre un avvertimento:

" Passando argomento 1 di set ... rende puntatore dal numero intero senza un cast "...

Come diavolo inserisco un bool in un dizionario ry?

risposta

116

I valori in un NSDictionary devono essere oggetti. Per risolvere questo problema, avvolgere i booleani in NSNumber oggetti:

[parameters setValue:[NSNumber numberWithBool:news] forKey:@"news"]; 
[parameters setValue:[NSNumber numberWithBool:mails] forKey:@"mails"]; 
+10

E non dimentichiamoci che con la versione 1.5 di Clang, possiamo usare letterali: 'NSNumber * yesNumber = @ YES'; equivalente a '[NSNumber numberWithBool: YES]' – coco

+9

Quindi, come dice @coco, puoi usare '@ YES' e' @ NO' come sostituti di '[NSNumber numberWithBool: YES]' e '[NSNumber numberWithBool: NO]' rispettivamente. E come sottolineato da @AlBlue di seguito, il modo per recuperare il valore dal dizionario in seguito sarebbe utilizzare '[[myDictionary objectForKey: theKey] boolValue]'. – RoberRM

+0

No No No. Si sta utilizzando setValue, che non è un metodo NSMutableDictionary, ma un metodo KVO. Usa invece setObject. –

14

I contenitori Objective-C possono memorizzare solo oggetti Objective-C, quindi è necessario avvolgere BOOL in alcuni oggetti. È possibile creare un oggetto NSNumber con [NSNumber numberWithBool] e memorizzare il risultato.
Successivamente è possibile ripristinare il valore booleano utilizzando NSnumber -boolValue.

6

È possibile inserire @"YES" o @"NO" oggetti stringa e Cocoa lo trasmetterà al bool una volta letti di nuovo.

Altrimenti suggerirei di creare un dizionario usando il metodo factory come dictionaryWithObjectsAndKeys:.

+0

Che suona pericoloso - cosa succede se si voleva la stringa? – quantumpotato

+0

Potrei sbagliarmi, ma usare boolValue e stringValue darebbe risultati necessari. Hai bisogno di un booleano? Usa boolValue. Hai bisogno di una stringa? Vai con stringValue. – Eimantas

+0

@Eimantas Preferisco decisamente la tua strada ...;-) –

8

A BOOL non è un oggetto - è un sinonimo di un int e ha 0 o 1 come valori. Di conseguenza, non verrà inserito in una struttura contenente oggetti.

È possibile utilizzare NSNumber per creare un wrapper di oggetti per qualsiasi tipo di numero intero; c'è un costruttore [NSNumber numberWithBool:] che puoi invocare per ottenere un oggetto, e poi usarlo. Allo stesso modo, è possibile utilizzarlo per ottenere di nuovo l'oggetto: [obj boolValue].

2

Vedendo la risposta di @Steve Harrison Ho un commento. Per qualche ragione questo non funziona con il passaggio di proprietà di oggetti come per es.

[parameters setValue:[NSNumber numberWithBool:myObject.hasNews] forKey:@"news"]; 

Questo imposta la chiave news su null nel parametro NSDictionary (per qualche ragione non riesce a capire veramente perché)

La mia unica soluzione era quella di utilizzare @ modo di Eimantas come segue:

[parameters setValue:[NSNumber numberWithBool:myObject.hasNews ? @"YES" : @"NO"] forKey:@"news"]; 

Questo ha funzionato perfettamente. Non chiedermi perché passare direttamente lo BOOL non funziona, ma almeno ho trovato una soluzione. Qualche idea?

7

codice moderna per riferimento:

parameters[@"getNews"] = @(news);