Como posso adicionar um valor booleano a um NSDictionary?

112

Bem, para inteiros eu usaria NSNumber. Mas SIM e NÃO não são objetos, eu acho. Afaik Eu só posso adicionar objetos a um NSDictionary, certo?

Não consegui encontrar nenhuma classe de wrapper para booleanos. Existe algum?

obrigado
fonte

Respostas:

156

Você usa NSNumber.

Possui métodos init ... e number ... que usam booleanos, assim como faz inteiros e assim por diante.

Da referência de classe NSNumber :

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

e:

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

e:

// Returns the receiver’s value as a BOOL.
- (BOOL)boolValue
prejudica
fonte
Ótimo! Eu acho que internamente ele armazena o bool como 0/1?
Obrigado
5
@harms está correto. Por exemplo: NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"someKey", nil];
So Over It
29
É importante ressaltar que agora existe uma sintaxe literal para NSNumbers. @YESé o mesmo que[NSNumber numberWithBool:YES]
jcampbell1
51

A nova sintaxe desde Apple LLVM Compiler 4.0

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

A sintaxe converte BOOL em NSNumber, o que é aceitável para NSDictionary.

Brian
fonte
16

Se você estiver declarando-o como literal e estiver usando o clang v3.1 ou superior, deverá usar @NO / @YES se estiver declarando-o como literal. Por exemplo

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

Para mais informações sobre isso:

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

Sabalaba
fonte
1
Obtenha um erro do compilador: Tipos de ponteiro incompatíveis inicializando NSMutableDictionary * com uma expressão do tipo NSDictionary. Se você alterar a declaração para NSDictionary em vez disso, obterá erro do compilador: Método esperado para escrever elemento de dicionário não encontrado no objeto do tipo NSDictionary *
Tony
1
O literal criará apenas um NSDictionary, não um NSMutableDictionary. Portanto, atribuir @YESa foo[@"bar"]não é possível, pois @{ @"key": @NO }não é mutável.
redhotvengeance
3

Como jcampbell1 apontou, agora você pode usar a sintaxe literal para NSNumbers:

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

Experimente isto:

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

A saída será a seguinte:

Boolean é TRUE para ' Pratik '

Booleano é FALSO para ' Sachin '

NSPratik
fonte
1
Você também pode fazer [NSNumber numberWithBool:NO]e [NSNumber numberWithBool:YES].
Alex Zavatone