如何将 NSNumber 转换和比较为 BOOL?

Posted

技术标签:

【中文标题】如何将 NSNumber 转换和比较为 BOOL?【英文标题】:How to convert and compare NSNumber to BOOL? 【发布时间】:2010-03-19 16:41:28 【问题描述】:

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

    如何从 NSNumber 转换回 BOOL? 如何将 NSNumber 与 BOOL 值进行比较。

目前我有:

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

有更好的比较方法吗?

谢谢!

【问题讨论】:

也许,也许读一下spec for NSNumber?? @HotLicks 我理解您对过于简单和未经研究的问题的愤怒。但是对于我们这些熟悉提供真正布尔数据类型的更现代语言的人来说,在 C 和 Objective-C 中模拟布尔值是相当令人困惑的——远非简单。 【参考方案1】:

您当前比较两个指针。使用NSNumbers 方法来实际比较两者:

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

要从 NSNumber 获取布尔值,请使用 -(BOOL)boolValue

BOOL b = [num boolValue];

这样比较对我来说更容易阅读:

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

【讨论】:

@GeorgFritzsche 我建议您将第二个剪断移到第一个上方并建议主要使用它。第一个是“效率较低”——我不想在这里做过早的优化,但是为什么要创建一个多余的NSNumber 实例呢? @H2CO3:看看我首先回复的 OP 的原始 sn-p,以便从中找到更好的选择。【参考方案2】:

斯威夫特 4:

let newBoolValue = nsNumberValue.boolValue

【讨论】:

【参考方案3】:

NSUserDefaults 有两种方法可以透明地使用布尔值进行操作:

- (BOOL)boolForKey:(NSString *)defaultName

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

【讨论】:

【参考方案4】:

我设法从 NSConcreteValue 中弄清 NSNumber 的“布尔值”(doh!) 的唯一方法是使用以下...

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

其他所有技巧...失败。买家要小心,这不是万无一失的(__NSCFNumber 很可能是特定于平台/机器的 - 它只是 Apple 的实施细节)......但正如他们所说...... 没有其他工作!

【讨论】:

以上是关于如何将 NSNumber 转换和比较为 BOOL?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 NSString 转换为 NSNumber

将 JSON ARRAY 转换为 NSNumber 数组

将 NSString 转换为 NSNumber 会导致数字过多和奇怪的舍入

使用 NSNumberFormatter 和 RestKit 将 NSCFNumber 转换为 NSNumber 时出错

将 NSNumber 转换为 long

将 NSString 转换为 NSNumber 精度问题