Подтвердить что ты не робот

Как преобразовать и сравнить NSNumber с BOOL?

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

  • как преобразовать обратно из NSNumber в BOOL?
  • Как сравнить значение NSNumber с BOOL.

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

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

какой-нибудь лучший способ сравнения?

Спасибо!

4b9b3361

Ответ 1

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

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

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

BOOL b = [num boolValue];

С этим сравнение будет легче читать для меня таким образом:

if([num boolValue] == NO) {
    // ...
}

Ответ 2

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

- (BOOL)boolForKey:(NSString *)defaultName

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

Ответ 3

Единственный способ, которым мне удалось выделить booleanity NSNumber из его NSConcreteValue (doh!), было следующее:

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

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

Ответ 4

Swift 4:

let newBoolValue = nsNumberValue.boolValue

enter image description here