Come posso aggiungere un valore booleano a un NSDictionary?


112

Bene, per gli interi userei NSNumber. Ma SÌ e NO non sono oggetti, immagino. Afaik posso solo aggiungere oggetti a un NSDictionary, giusto?

Non sono riuscito a trovare alcuna classe wrapper per booleani. C'è qualche?

Risposte:


156

Usi NSNumber.

Ha metodi init ... e number ... che accettano valori booleani, proprio come gli interi e così via.

Dal riferimento alla classe NSNumber :

// 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

Grande! Immagino che internamente memorizzi il valore bool come 0/1?
Grazie

5
@harms è corretto. Ad esempio: NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"someKey", nil];
So Over It

29
Vale la pena sottolineare che ora esiste una sintassi letterale per NSNumbers. @YESè uguale a[NSNumber numberWithBool:YES]
jcampbell1

51

La nuova sintassi da Apple LLVM Compiler 4.0

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

La sintassi viene convertita BOOLin NSNumber, che è accettabile per NSDictionary.


16

Se lo dichiari come letterale e stai usando clang v3.1 o superiore, dovresti usare @NO / @YES se lo dichiari come letterale. Per esempio

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

Per maggiori informazioni su questo:

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 modifichi la dichiarazione in NSDictionary, ottieni 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 file NSMutableDictionary. Quindi l'assegnazione @YESa foo[@"bar"]non è possibile poiché @{ @"key": @NO }non è modificabile.
redhotvengeance

3

Come ha sottolineato jcampbell1 , ora puoi usare 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à il seguente:

Boolean è TRUE per " Pratik "

Boolean è FALSE per " Sachin "


1
Puoi anche fare [NSNumber numberWithBool:NO]e [NSNumber numberWithBool:YES].
Alex Zavatone
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.