2009-05-24 12 views
102

Cóż, dla liczb całkowitych użyłbym NSNumber. Ale TAK i NIE są obiektami, jak sądzę. A.f.a.i.k. Mogę tylko dodawać obiekty do NSDictionary, prawda?Jak dodać wartość boolean do NSDictionary?

Nie mogłem znaleźć żadnej klasy wrapperów dla booleans. Czy jest jakiś?

Odpowiedz

149

Używasz NSNumber.

Ma init ... i numer ... metody, które biorą booleans, tak jak robi liczb całkowitych i tak dalej.

Z NSNumber class reference:

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

oraz:

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

oraz:

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

świetnie! Sądzę, że wewnętrznie przechowuje bool jako 0/1? – Thanks

+5

@harms jest poprawny. Jako przykład: 'NSDictionary * dictionary = [słownik NSDictionaryWithObjectsAndKeys: [numer NSNumberBack: YES], @" someKey ", nil];' –

+24

Warto zauważyć, że istnieje teraz dosłowna składnia dla NSNumbers. '@ YES' jest tym samym, co' [numer NSNumberWithBool: YES] ' – jcampbell1

16

Jeśli deklarując ją jako dosłowną i używasz clang v3.1 lub powyżej, powinieneś użyć @NO/@YES, jeśli deklarujesz to jako literał. Na przykład.

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

Aby uzyskać więcej informacji na ten temat:

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

+1

Błąd kompilacji: Niekompatybilne typy wskaźników inicjujących NSMutableDictionary * z wyrażeniem typu NSDictionary.Jeśli zamiast tego zmienisz deklarację na NSDictionary, uzyskasz błąd kompilatora: Oczekiwana metoda zapisu elementu słownika, którego nie znaleziono na obiekcie typu NSDictionary * – Tony

+1

Dosłowne utworzy tylko 'NSDictionary', a nie' NSMutableDictionary'. Zatem przypisanie '@ YES' do' foo [@ "bar"] 'nie jest możliwe, ponieważ' @ {@ "klucz": @ NO} 'nie jest zmienny. – redhotvengeance

+0

Yup, przepraszam za tę literówkę, zaktualizowałem ją. – sabalaba

39

Nowa składnia od Apple LLVM Compiler 4.0

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

Składnia zamienia BOOL do NSNumber, który jest do zaakceptowania NSDictionary.

+1

To powinna być zaakceptowana odpowiedź. –

+0

Nadal działa, naprawdę dziękuję człowieku! –

2

Jak jcampbell1 wskazał, teraz można użyć składni dosłownego dla NSNumbers:

NSDictionary *data = @{ 
         // when you always pass same value 
         @"someKey" : @YES 
         // if you want to pass some boolean variable 
         @"anotherKey" : @(someVariable) 
         }; 
-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'"); 
} 

wyjście będzie w następujący sposób:

Boolean jest TRUE za "Pratik '

logiczną FAŁSZ dla' Sachin '

+1

Można również wykonać "[Numer NSNumberWithBool: NO]" i "[NSNumber numberWithBool: YES]". –