Как преобразовать и сравнить NSNumber с BOOL?
Сначала я конвертирую значение BOOL в NSNumber, чтобы поместить его в NSUserDefaults. Позже я хотел бы получить значение BOOL из NSUserDefaults, но, очевидно, я получаю NSNumber вместо BOOL. Мои вопросы?
- как преобразовать обратно из NSNumber в BOOL?
- Как сравнить значение NSNumber с BOOL.
В настоящее время у меня есть:
if (someNSNumberValue == [NSNumber numberWithBool:NO]) {
do something
}
какой-нибудь лучший способ сравнения?
Спасибо!
Ответы
Ответ 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]()