Iphone 如何将NSNumber转换并与BOOL进行比较?

Iphone 如何将NSNumber转换并与BOOL进行比较?,iphone,objective-c,Iphone,Objective C,首先,我将BOOL值转换为NSNumber,以便将其转换为NSUserDefaults。稍后我想从NSUserDefaults中检索BOOL值,但显然我得到的是NSNumber而不是BOOL。我的问题是什么 如何从NSNumber转换回BOOL 如何将NSNumber与布尔值进行比较 目前我有: if (someNSNumberValue == [NSNumber numberWithBool:NO]) { do something } 有没有更好的方法来进行比较 谢谢 您当前比较两个

首先,我将BOOL值转换为NSNumber,以便将其转换为NSUserDefaults。稍后我想从NSUserDefaults中检索BOOL值,但显然我得到的是NSNumber而不是BOOL。我的问题是什么

  • 如何从NSNumber转换回BOOL
  • 如何将NSNumber与布尔值进行比较
  • 目前我有:

    if (someNSNumberValue == [NSNumber numberWithBool:NO]) {
        do something
    }
    
    有没有更好的方法来进行比较


    谢谢

    您当前比较两个指针。使用
    NSNumber
    s方法来实际比较这两种方法:

    if([someNSNumberValue isEqualToNumber:[NSNumber numberWithBool:NO]]) {
        // ...
    }
    
    要从
    NSNumber
    获取布尔值,请使用
    -(bool)布尔值

    BOOL b = [num boolValue];
    
    这样,我就更容易阅读比较:

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

    NSUserDefaults
    有两种方法可以透明地使用布尔运算:

    -(BOOL)boolforky:(NSString*)defaultName


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

    我设法从其
    NSConcreteValue
    中欺骗一个
    NSNumber
    的“booleanity”(booleanity)的唯一方法是使用以下内容

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

    每一个其他的把戏失败。买家注意,这并不是万无一失的(
    \uu NSCFNumber
    很可能是平台/机器特定的-这只是苹果的实施细节)。。。但正如他们所说。。没有别的办法

    Swift 4:

    let newBoolValue = nsNumberValue.boolValue
    

    @GeorgFritzsche我建议你将第二个剪子移到第一个上面,并建议主要使用它。第一个是“效率较低”-我不想在这里进行过早的优化,但是为什么要创建一个多余的
    NSNumber
    实例呢?@H2CO3:看看我首先回应的OP的原始片段,从中找到一个更好的选项。也许,也许你可以读一下???@HotLicks,我理解你对过于简单和没有研究的问题的愤怒。但对于我们这些有过提供真正布尔数据类型的现代语言经验的人来说,在C和Objective-C中对布尔数据的模拟是相当混乱的——远不简单。