Как преобразовать и сравнить NSNumber в BOOL? - PullRequest
50 голосов
/ 19 марта 2010

Сначала я конвертирую значение BOOL в NSNumber, чтобы поместить его в NSUserDefaults. Позже я хотел бы получить значение BOOL из NSUserDefaults, но, очевидно, я получаю NSNumber вместо BOOL. Мои вопросы есть?

  1. как конвертировать обратно из NSNumber в BOOL?
  2. Как сравнить NSNumber со значением BOOL.

В настоящее время у меня есть:

if (someNSNumberValue == [NSNumber numberWithBool:NO]) {
    do something
}

Есть ли лучший способ сравнения?

Спасибо!

Ответы [ 3 ]

137 голосов
/ 19 марта 2010

Вы в настоящее время сравниваете два указателя.Вместо этого используйте NSNumber s методы для фактического сравнения двух:

if([someNSNumberValue isEqualToNumber:[NSNumber numberWithBool:NO]]) {
    // ...
}

Чтобы получить значение bool из NSNumber, используйте -(BOOL)boolValue:

BOOL b = [num boolValue];

С этим сравнениеммне было бы легче читать так:

if([num boolValue] == NO) {
    // ...
}
1 голос
/ 09 июля 2013

NSUserDefaults имеет два метода прозрачной работы с логическими значениями:

- (BOOL)boolForKey:(NSString *)defaultName

- (void)setBool:(BOOL)value forKey:(NSString *)defaultName

0 голосов
/ 19 февраля 2014

ЕДИНСТВЕННЫЙ способ, которым мне удалось найти "логическое значение" NSNumber из его NSConcreteValue (дох!) , заключался в следующем ...

id x = [self valueForKey:@"aBoolMaybe"];
if ([x respondsToSelector:@selector(boolValue)] && 
    [x isKindOfClass:objc_getClass("__NSCFNumber")])
    [self doSomethingThatExpectsABool:[x boolValue]];

Любой другой трюк ... НЕ УДАЛ . Покупатель, будьте осторожны, это небезопасно (__NSCFNumber вполне может зависеть от платформы / машины - это исключительно детали реализации Apple ) ... но, как говорится .. больше ничего не получалось!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...