How to convert and compare NSNumber to BOOL?

IphoneObjective C

Iphone Problem Overview


First I convert BOOL value to NSNumber in order to put it into NSUserDefaults. Later I would like to retrieve the BOOL value from the NSUserDefaults, but obviously I get NSNumber instead of BOOL. My questions are?

  1. how to convert back from NSNumber to BOOL?
  2. How to compare NSNumber to BOOL value.

Currently I have:

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

any better way to to the comparison?

Thanks!

Iphone Solutions


Solution 1 - Iphone

You currently compare two pointers. Use NSNumbers methods instead to actually compare the two:

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

To get the bool value from a NSNumber use -(BOOL)boolValue:

BOOL b = [num boolValue];

With that the comparison would be easier to read for me this way:

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

Solution 2 - Iphone

Swift 4:

let newBoolValue = nsNumberValue.boolValue

enter image description here

Solution 3 - Iphone

NSUserDefaults has two methods to transparently operate with booleans:

- (BOOL)boolForKey:(NSString *)defaultName

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

Solution 4 - Iphone

The ONLY way I managed to finagle a NSNumber's "booleanity" from its NSConcreteValue(doh!) was with the following...

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

Every other trick... FAILED. Buyer beware, this isn't foolproof (__NSCFNumber may well be platform/machine specific - it is solely Apple's implementation detail)... but as they say.. nothing else worked!

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJakubView Question on Stackoverflow
Solution 1 - IphoneGeorg FritzscheView Answer on Stackoverflow
Solution 2 - IphonealegelosView Answer on Stackoverflow
Solution 3 - IphoneRob ZombieView Answer on Stackoverflow
Solution 4 - IphoneAlex GrayView Answer on Stackoverflow