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?

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

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.


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


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

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


1
Vous pouvez également faire [NSNumber numberWithBool:NO]et [NSNumber numberWithBool:YES].
Alex Zavatone
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.