Как я могу добавить логическое значение в NSDictionary?

112

Ну, для целых чисел я бы использовал NSNumber. Но ДА и НЕТ, я думаю, не объекты. Afaik я могу только добавлять объекты в NSDictionary, не так ли?

Мне не удалось найти класс-оболочку для логических значений. Есть ли?

Спасибо
источник

Ответы:

156

Вы используете NSNumber.

У него есть методы init ... и number ..., которые принимают логические значения, как и целые числа и так далее.

Из справочника класса NSNumber :

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

и:

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

и:

// Returns the receiver’s value as a BOOL.
- (BOOL)boolValue
вредит
источник
Большой! Я предполагаю, что внутри он хранит bool как 0/1?
Спасибо,
5
@harms правильный. В качестве примера: NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"someKey", nil];
So Over It
29
Стоит отметить, что теперь существует буквальный синтаксис для NSNumbers. @YESсовпадает с[NSNumber numberWithBool:YES]
jcampbell1 04
51

Новый синтаксис с Apple LLVM Compiler 4.0

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

Синтаксис преобразуется BOOLв NSNumber, что приемлемо NSDictionary.

Брайан
источник
16

Если вы объявляете его как литерал и используете clang v3.1 или выше, вы должны использовать @NO / @YES, если вы объявляете его как литерал. Например

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

Для получения дополнительной информации об этом:

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

sabalaba
источник
1
Получите ошибку компилятора: несовместимые типы указателей, инициализирующие NSMutableDictionary * выражением типа NSDictionary. Если вместо этого вы измените объявление на NSDictionary, получите ошибку компилятора: ожидаемый метод записи элемента словаря не найден в объекте типа NSDictionary *
Тони
1
Литерал создаст только объект NSDictionary, но не объект NSMutableDictionary. Таким образом , назначая @YESна foo[@"bar"]это не представляется возможным , так как @{ @"key": @NO }не является изменяемым.
redhotvengeance 08
3

Как указал jcampbell1 , теперь вы можете использовать буквальный синтаксис для NSNumbers:

NSDictionary *data = @{
                      // when you always pass same value
                      @"someKey" : @YES
                      // if you want to pass some boolean variable
                      @"anotherKey" : @(someVariable)
                      };
Войта
источник
-2

Попробуй это:

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

Результат будет следующим:

Boolean является значение TRUE для ' Pratik '

Логическое значение FALSE для ' Sachin '

NSPratik
источник
1
Вы также можете сделать [NSNumber numberWithBool:NO]и [NSNumber numberWithBool:YES].
Alex Zavatone