Comment puis-je ajouter une valeur booléenne à un NSDictionary?

112

Eh bien, pour les nombres entiers, j'utiliserais NSNumber. Mais OUI et NON ne sont pas des objets, je suppose. Afaik je ne peux ajouter des objets qu'à un NSDictionary, non?

Je n'ai pas trouvé de classe wrapper pour les booléens. Y a-t-il?

Merci
la source

Réponses:

156

Vous utilisez NSNumber.

Il a des méthodes init ... et number ... qui prennent des booléens, tout comme il le fait avec des entiers et ainsi de suite.

À partir de la référence de classe NSNumber :

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

et:

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

et:

// Returns the receiver’s value as a BOOL.
- (BOOL)boolValue
mal
la source
Génial! Je suppose qu'en interne, il stocke le booléen comme 0/1?
Merci
5
@harms est correct. À titre d'exemple: NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"someKey", nil];
So Over It
29
Il est à noter qu'il existe désormais une syntaxe littérale pour NSNumbers. @YESest le même que[NSNumber numberWithBool:YES]
jcampbell1
51

La nouvelle syntaxe depuis Apple LLVM Compiler 4.0

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

La syntaxe est convertie BOOLen NSNumber, ce qui est acceptable pour NSDictionary.

Brian
la source
16

Si vous le déclarez comme un littéral et que vous utilisez clang v3.1 ou supérieur, vous devez utiliser @NO / @YES si vous le déclarez comme un littéral. Par exemple

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

Pour plus d'informations à ce sujet:

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

sabalaba
la source
1
Obtenez une erreur du compilateur: types de pointeurs incompatibles initialisant NSMutableDictionary * avec une expression de type NSDictionary. Si vous modifiez la déclaration en NSDictionary à la place, obtenez une erreur du compilateur: Méthode attendue pour écrire l'élément de dictionnaire introuvable sur l'objet de type NSDictionary *
Tony
1
Le littéral ne créera qu'un NSDictionary, pas un NSMutableDictionary. L'affectation @YESà foo[@"bar"]n'est donc pas possible car elle @{ @"key": @NO }n'est pas modifiable.
redhotvengeance
3

Comme jcampbell1 l'a souligné, vous pouvez maintenant utiliser la syntaxe littérale pour NSNumbers:

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

Essaye ça:

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

La sortie sera la suivante:

Boolean est TRUE pour ' Pratik '

Boolean est FALSE pour ' Sachin '

NSPratik
la source
1
Vous pouvez également faire [NSNumber numberWithBool:NO]et [NSNumber numberWithBool:YES].
Alex Zavatone