Jakub
Jakub

Reputation: 3129

How to convert and compare NSNumber to BOOL?

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!

Upvotes: 53

Views: 65244

Answers (4)

alegelos
alegelos

Reputation: 2604

Swift 4:

let newBoolValue = nsNumberValue.boolValue

enter image description here

Upvotes: 6

Alex Gray
Alex Gray

Reputation: 16463

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!

Upvotes: 0

pronebird
pronebird

Reputation: 12230

NSUserDefaults has two methods to transparently operate with booleans:

- (BOOL)boolForKey:(NSString *)defaultName

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

Upvotes: 1

Georg Fritzsche
Georg Fritzsche

Reputation: 98984

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) {
    // ...
}

Upvotes: 143

Related Questions