Jak mogę dodać wartość logiczną do NSDictionary?

112

Cóż, dla liczb całkowitych użyłbym NSNumber. Ale TAK i NIE to chyba obiekty. Afaik Mogę dodawać obiekty tylko do NSDictionary, prawda?

Nie udało mi się znaleźć żadnej klasy otoki dla wartości logicznych. Czy jest jakiś?

Dzięki
źródło

Odpowiedzi:

156

Używasz NSNumber.

Ma metody init ... i number ..., które przyjmują wartości logiczne, podobnie jak liczby całkowite i tak dalej.

Z odwołania do klasy NSNumber :

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

i:

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

i:

// Returns the receiver’s value as a BOOL.
- (BOOL)boolValue
szkody
źródło
Wspaniały! Domyślam się, że wewnętrznie przechowuje bool jako 0/1?
Dzięki
5
@harms jest poprawne. Na przykład: NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"someKey", nil];
So Over It
29
Warto zauważyć, że istnieje teraz dosłowna składnia dla NSNumbers. @YESjest taki sam jak[NSNumber numberWithBool:YES]
jcampbell1
51

Nowa składnia od Apple LLVM Compiler 4.0

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

Składnia jest konwertowana BOOLna NSNumber, co jest akceptowalne dla NSDictionary.

Brian
źródło
16

Jeśli deklarujesz go jako literał i używasz clang w wersji 3.1 lub nowszej, powinieneś użyć @NO / @YES, jeśli deklarujesz go jako literał. Na przykład

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

Więcej informacji na ten temat:

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

sabalaba
źródło
1
Uzyskaj błąd kompilatora: niezgodne typy wskaźników inicjujące NSMutableDictionary * z wyrażeniem typu NSDictionary. Jeśli zamiast tego zmienisz deklarację na NSDictionary, otrzymasz błąd kompilatora: nie znaleziono oczekiwanej metody zapisu elementu słownika w obiekcie typu NSDictionary *
Tony
1
Dosłowne utworzy tylko NSDictionary, a nie NSMutableDictionary. Więc przypisanie @YESdo foo[@"bar"]nie jest możliwe, ponieważ @{ @"key": @NO }nie jest zmienne.
redhotvengeance
3

Jak zauważył jcampbell1 , teraz możesz użyć dosłownej składni dla NSNumbers:

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

Spróbuj tego:

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

Wynik będzie następujący:

Wartość logiczna jest PRAWDA dla „ Pratik

Boolean jest FAŁSZ dla „ Sachin

NSPratik
źródło
1
Możesz także zrobić [NSNumber numberWithBool:NO]i [NSNumber numberWithBool:YES].
Alex Zavatone