Як я можу додати булеве значення до 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];
Так над цим

29
Варто зазначити, що зараз існує буквальний синтаксис для NSNumbers. @YESте саме, що[NSNumber numberWithBool:YES]
jcampbell1

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


1
Отримати помилку компілятора: Несумісні типи вказівників, що ініціалізують NSMutableDictionary * з виразом типу NSDictionary. Якщо ви заміните декларацію на NSDictionary, замість цього отримайте помилку компілятора: Очікуваний метод для запису елемента словника, який не знайдено на об’єкті типу NSDictionary *
Tony

1
Буквал створить лише NSDictionary, а не ан NSMutableDictionary. Таким чином , призначаючи @YESна foo[@"bar"]це не представляється можливим , тому що @{ @"key": @NO }не є змінним.
redhotvengeance

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 ІСТИНА для ' Pratik '

Boolean FALSE для ' Sachin '


1
Ви також можете робити [NSNumber numberWithBool:NO]і [NSNumber numberWithBool:YES].
Алекс Заватоне
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.