2010-03-19 4 views
46

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

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

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

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

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

Спасибо!

+1

Возможно, возможно, просто прочитайте [spec для NSNumber] (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html)? ? –

+2

@HotLicks Я понимаю ваше раздражение с чрезмерно простыми и неуточненными вопросами. Но для тех из нас, кто имеет опыт работы с более современными языками, которые предлагают настоящий тип данных Boolean, симуляция логического в C и Objective-C довольно запутанна - далеко не простая. –

ответ

127

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

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

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

BOOL b = [num boolValue]; 

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

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

Отлично! Теперь я понимаю, как это должно работать. Большое спасибо! – Jakub

+0

@GeorgFritzsche Я предлагаю вам переместить второй отрезанный выше первого и рекомендовать его использование в первую очередь. Первый из них «менее эффективен» - я не хочу делать здесь преждевременную оптимизацию, но зачем создавать лишний экземпляр NSNumber? – 2013-07-09 17:43:59

+0

@ H2CO3: Взгляните на оригинальный фрагмент из OP, на который я ответил первым, чтобы перейти к лучшему варианту оттуда. –

1

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

- (BOOL)boolForKey:(NSString *)defaultName

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

0

Единственный способ мне удалось надувать в NSNumber «s "booleanity" от своего NSConcreteValue(DOH!) был следующим ...

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

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

Смежные вопросы