2011-11-11 8 views
13

Sto cercando di salvare un valore base di dati booleano in una mappa come segue -come inserire un (BOOL *) in NSMutableDictionary

[recentTags setValue:[NSNumber numberWithBool:[aMessage isSet]] forKey:[aMessage tagName]]; 

Mi dà un errore che dice "puntatore Incompatibile a intero conversione invio di BOOL * aka signed char * a 'BOOL' aka char signed "

Come inserire un BOOL * nel dizionario?

+0

Perché '-isSet' restituisce' BOOL * 'invece di' BOOL'? –

risposta

41

Avvolgere il BOOL in un NSNumber:

NSNumber *boolNumber = [NSNumber numberWithBool:YES]; 

per farlo fuori:

BOOL b = [boolNumber boolValue]; 

Puoi avvolgere altri tipi non-oggetto (ad esempio un puntatore o una struct) in un NSValue .


EDIT: Supponendo che realmente significa un BOOL * (puntatore):

NSValue *boolValue = [NSValue value:pointerToBool withObjCType:@encode(BOOL*)]; 
BOOL *b = [boolValue pointerValue]; 
+0

Come puoi vedere nella mia domanda, lo sto già facendo ma non funziona per me. Questo è quando ricevo l'errore che ho menzionato. – Suchi

+0

Sei sicuro che '[aMessage isSet]' sta restituendo un BOOL e non un BOOL *? Se restituisce quest'ultimo, è necessario usare '[NSNumber numberWithBool: * [aMessage isSet]]' (anche se si dovrebbe prima verificare che non sia NULL). – titaniumdecoy

+2

A partire da Clang v3.1, possiamo usare letterali: 'NSNumber * yesNumber = @YES;' e 'NSNumber * noNumber = @NO;', equivalente a '[NSNumber numberWithBool: YES]' etc – coco

0

Il tuo metodo isSet avrebbe bisogno di avere la seguente firma: - (BOOL)isSet;

Supponendo che è il caso, ci non dovrebbe esserci alcun problema nell'utilizzare NSNumber come menzionato da titaniumdecoy.

L'ultima frase mi incuriosisce, BOOL *. Sicuramente vuoi dire BOOL, se hai assolutamente bisogno di un riferimento booleano, allora ti suggerirei di memorizzare il BOOL iniziale/effettivo in un NSNumber e di memorizzare i riferimenti quell'oggetto ovunque ti serva (ad esempio NSMutableDictionary).

Problemi correlati