在Objective-C中检测NSNumber的0或nil值

时间:2016-01-23 16:35:30

标签: iphone null

在SO和其他地方有很多可接受的答案,关于如何检测零值,但很多冲突似乎没有对我有用。我有一个NSNumber,它以0的形式登录到控制台。我想按如下方式对其进行筛选:

NSNumber *itemid = item.iid;

//pseudocode
if (itemid is not 0 or nil or null or empty or missing, i.e. is something like 22222) {
//there is an item id.
}

我尝试了以下许多变体,但逻辑无效:

NSLog(@"itemid is:%@",itemid); //logs as 0
    if (![itemid isKindOfClass:[NSNull class]] && itemid!=nil &&![itemid intValue]==0) {
             NSLog(@"there is an itemid");
    }

有人可以推荐一种万无一失的方法来做到这一点吗?欢呼声。

1 个答案:

答案 0 :(得分:1)

如果itemid可以NSNull,那么这行代码就会被破坏:

NSNumber *itemid = item.iid;

永远不适合为NSNull变量分配NSNumber值。首先,你需要照顾它。

// This will also happen to take care of the nil case.
if (! [item.iid isKindOfClass:[NSNumber class]]) { 
    return; // Get us out of here. Someone did a bad thing. We should really NSAssert here.
}

如果您的item对象说它为NSNumber返回iid,那么它需要在内部删除NSNull值并始终返回NSNumber或者没有。这是它的工作;呼叫者不应该修复item所在的案例。

好的,现在让我们假设我们知道itemid确实是NSNumber而且没有人像在NSNull中加入nil一样疯狂。然后它是一个数字或nil。 (如果您执行了上一次检查,我们也知道它不是intValue。)不管怎样,if ([item.idd intValue] == 0) { return; // Nothing to see here. } 都是0,所以:

nil

要理解的关键是,当您向<trace> <string key="id" value="1"/> <event> <string key="Hello" value="1"/> <string key="World" value="2"/> </event> <event> <string key="Stack" value="3"/> <string key="Overflow" value="4"/> </event> </trace> 发送消息时,它始终会返回“零值”。 0,0.0,false或nil,具体取决于它是某种数字,布尔值还是对象。如果返回一个结构,那将是用零填充的结构。无论什么最像“很多零”都是你会得到的。在ObjC和精细实践中依靠这一事实是非常正常的。