在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");
}
有人可以推荐一种万无一失的方法来做到这一点吗?欢呼声。
答案 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和精细实践中依靠这一事实是非常正常的。