Wie kann ich einem NSDictionary einen booleschen Wert hinzufügen?

112

Nun, für ganze Zahlen würde ich verwenden NSNumber. Aber JA und NEIN sind keine Objekte, denke ich. Afaik Ich kann nur Objekte zu einem hinzufügen NSDictionary, oder?

Ich konnte keine Wrapper-Klasse für Boolesche Werte finden. Gibt es irgendwelche?

Vielen Dank
quelle

Antworten:

156

Sie verwenden NSNumber.

Es hat init ... und number ... Methoden, die Boolesche Werte annehmen, genau wie ganze Zahlen und so weiter.

Aus der NSNumber-Klassenreferenz :

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

und:

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

und:

// Returns the receiver’s value as a BOOL.
- (BOOL)boolValue
schadet
quelle
Toll! Ich denke intern speichert es den Bool als 0/1?
Danke
5
@harms ist korrekt. Als Beispiel: NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"someKey", nil];
So Over It
29
Es sei darauf hingewiesen, dass es jetzt eine wörtliche Syntax für NSNumbers gibt. @YESist das gleiche wie[NSNumber numberWithBool:YES]
jcampbell1
51

Die neue Syntax seit Apple LLVM Compiler 4.0

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

Die Syntax konvertiert BOOLzu NSNumber, die akzeptabel ist NSDictionary.

Brian
quelle
16

Wenn Sie es als Literal deklarieren und clang v3.1 oder höher verwenden, sollten Sie @NO / @YES verwenden, wenn Sie es als Literal deklarieren. Z.B

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

Für weitere Informationen dazu:

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

Sabalaba
quelle
1
Compilerfehler erhalten: Inkompatible Zeigertypen, die NSMutableDictionary * mit einem Ausdruck vom Typ NSDictionary initialisieren. Wenn Sie stattdessen die Deklaration in NSDictionary ändern, wird ein Compilerfehler angezeigt: Erwartete Methode zum Schreiben eines Wörterbuchelements, das nicht für ein Objekt vom Typ NSDictionary * gefunden wurde
Tony
1
Das Literal erzeugt nur ein NSDictionary, kein NSMutableDictionary. Eine Zuordnung @YESzu foo[@"bar"]ist also nicht möglich, da sie @{ @"key": @NO }nicht veränderbar ist.
Redhotvengeance
3

Wie jcampbell1 hervorhob , können Sie jetzt die wörtliche Syntax für NSNumbers verwenden:

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

Versuche dies:

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'");
}

Die Ausgabe lautet wie folgt:

Boolean ist WAHR für ' Pratik '

Boolean ist FALSCH für ' Sachin '

NSPratik
quelle
1
Sie können auch tun [NSNumber numberWithBool:NO]und [NSNumber numberWithBool:YES].
Alex Zavatone