2009-05-24 12 views

risposta

149

Si utilizza NSNumber.

Ha init ... e numero ... metodi che prendono i booleani, proprio come fanno gli interi e così via.

Dal NSNumber class reference:

// Creates and returns an NSNumber object containing a 
// given value, treating it as a BOOL. 
+ (NSNumber *)numberWithBool:(BOOL)value 

e:

// Returns an NSNumber object initialized to contain a 
// given value, treated as a BOOL. 
- (id)initWithBool:(BOOL)value 

e:

// Returns the receiver’s value as a BOOL. 
- (BOOL)boolValue 
+0

Grande! Immagino che internamente memorizzi il bool come 0/1? – Thanks

+5

@harms è corretto. Ad esempio: 'NSDictionary * dictionary = [Dizionario NSDictionaryWithObjectsAndKeys: [NSNumero numericoWithBool: YES], @" someKey ", nil];' –

+24

Vale la pena sottolineare che esiste ora una sintassi letterale per NSNumbers. '@ YES' è uguale a' [NSNumero numericoWithBool: YES] ' – jcampbell1

16

Se si dichiara come un letterale e si utilizza clang v3.1 o sopra, dovresti usare @NO/@YES se lo stai dichiarando come letterale. Per esempio.

NSMutableDictionary* foo = [@{ @"key": @NO } mutableCopy]; 
foo[@"bar"] = @YES; 

Per ulteriori informazioni che:

http://clang.llvm.org/docs/ObjectiveCLiterals.html

+1

Ottieni un errore del compilatore: tipi di puntatore incompatibili che inizializzano NSMutableDictionary * con un'espressione di tipo NSDictionary.Se invece si modifica la dichiarazione in NSDictionary, ottenere l'errore del compilatore: Metodo previsto per scrivere l'elemento del dizionario non trovato sull'oggetto di tipo NSDictionary * – Tony

+1

Il letterale creerà solo un 'NSDictionary', non un' NSMutableDictionary'. Quindi assegnare '@ YES' a' foo [@ "bar"] 'non è possibile poiché' @ {@ "key": @NO} 'non è mutabile. – redhotvengeance

+0

Sì, mi dispiace per quell'errore, l'ho aggiornato. – sabalaba

39

La nuova sintassi dal Apple LLVM Compiler 4.0

dictionary[@"key1"] = @(boolValue); 
dictionary[@"key2"] = @YES; 

La sintassi converte BOOL a NSNumber, che è accettabile per NSDictionary.

+1

Questa dovrebbe essere la risposta accettata. –

+0

Funziona ancora, davvero grazie amico! –

2

Come jcampbell1 sottolineato, ora è possibile utilizzare la sintassi letterale per NSNumbers:

NSDictionary *data = @{ 
         // when you always pass same value 
         @"someKey" : @YES 
         // if you want to pass some boolean variable 
         @"anotherKey" : @(someVariable) 
         }; 
-2

Prova questo:

NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; 
[dic setObject:[NSNumber numberWithBool:TRUE] forKey:@"Pratik"]; 
[dic setObject:[NSNumber numberWithBool:FALSE] forKey:@"Sachin"]; 

if ([dic[@"Pratik"] boolValue]) 
{ 
    NSLog(@"Boolean is TRUE for 'Pratik'"); 
} 
else 
{ 
    NSLog(@"Boolean is FALSE for 'Pratik'"); 
} 

if ([dic[@"Sachin"] boolValue]) 
{ 
    NSLog(@"Boolean is TRUE for 'Sachin'"); 
} 
else 
{ 
    NSLog(@"Boolean is FALSE for 'Sachin'"); 
} 

L'output sarà come segue:

booleano è TRUE per 'Pratik '

booleano è FALSO per' Sachin '

+1

Puoi anche fare '[NSNumber numberWithBool: NO]' e '[NSNumber numberWithBool: YES]'. –

Problemi correlati