繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM