[英]Detect 0 or nil values of NSNumber in Objective-C
在SO和其他地方,有很多关于如何检测nil值的公认答案,但是有许多冲突,但似乎没有一个对我有用。 我有一个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");
}
谁能推荐一种万无一失的方法来做到这一点? 干杯。
如果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
对象说它为iid
返回了一个NSNumber
,那么它需要在内部摆脱NSNull
值,并始终返回一个NSNumber
或nil。 那是它的工作; 呼叫者不必修复item
所在的情况。
好的,现在让我们假设我们知道itemid
确实是一个NSNumber
并且没有NSNull
在放置NSNull
那样疯狂地做任何事情。 然后是数字或nil
。 (如果您进行了前面的检查,我们也知道它也不为nil
。)不管哪种方式, intValue
都将为0,因此:
if ([item.idd intValue] == 0) {
return; // Nothing to see here.
}
要理解的关键是,当您向nil
发送消息时,它总是返回“类似零的值”。 0、0.0,false或nil,具体取决于它是某种数字,布尔值还是对象。 如果返回一个结构,则该结构将填充零。 最像“很多零”的东西就是您会得到的。 在ObjC和优良作法中,依靠这一事实是非常正常的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.