Iphone 如何检查NSNumber中的空值
首先,我承认我的无知,在我从事项目的几个月里,我学到了关于Objective-C的所有知识。我还发现Objective-C似乎将我使用过的任何其他语言中的简单问题复杂化了,这让我非常沮丧。这个问题就是一个很好的例子 在第一次运行中,我的应用程序下载了一堆JSON,用于填充CoreData存储。我使用Obj-C/JSON库(cjson反序列化器)将JSON转换为nsarray。在一个CoreData实体的JSON下载中,有一个字段包含一个数字(Iphone 如何检查NSNumber中的空值,iphone,null,compare,nsnumber,Iphone,Null,Compare,Nsnumber,首先,我承认我的无知,在我从事项目的几个月里,我学到了关于Objective-C的所有知识。我还发现Objective-C似乎将我使用过的任何其他语言中的简单问题复杂化了,这让我非常沮丧。这个问题就是一个很好的例子 在第一次运行中,我的应用程序下载了一堆JSON,用于填充CoreData存储。我使用Obj-C/JSON库(cjson反序列化器)将JSON转换为nsarray。在一个CoreData实体的JSON下载中,有一个字段包含一个数字(“show_id”:2),如果有一个或空(“show_
“show_id”:2
),如果有一个或空(“show_id”:null
),则标识另一个实体中的相关字段。在处理该字段时,我使用
NSNumber *shoIndex = [[item objectForKey:typeKey] objectForKey:@"show_id"];
然后,在尝试获取和链接相关记录之前,我会尝试检查我是否有一个有效的数字,以便在没有相关记录的情况下不会进行浪费性的处理
用…询问shoIndex
NSLog(@"shoIndex: %i, %@, %@", shoIndex, shoIndex, [shoIndex description]);
给
shoIndex: 19590600, <null>, <null>
否则
到目前为止,我做的唯一成功的检查是
if (![[shoIndex description] isEqualToString:@"<null>"]) {
if(![[shoIndex description]IsequalString:@”“){
有人能提出更好的办法吗
更新
从另一个角度来看,shoIndex
被指定为一个NSNumber
,它有时包含一个NSString
值@“
。Obj-C是否有类似于isa
的操作符,我可以用来检查shoIndex
的内容类型
TIA,Pedro.在Objective-c中,它是
nil
而不是null
。因此:
if (shotIndex != nil) {
// its not nil
}
使用
[shoObject class]
获取对象的类;因此,要测试shoObject
的类,您可以使用
[shoObject isKindOfClass:[NSString class]];
整理出定义空字符串或NSNumber的标记后,可以创建宏。我通过在名为CommonMacros.h的文件中保留一个IsEmpty宏来实现这一点。代码如下:
//Thanks Wil
//http://wilshipley.com/blog/2005/10/pimp-my-code-interlude-free-code.html
static inline BOOL IsEmpty(id thing) {
return thing == nil
|| ([thing isEqual:[NSNull null]]) //JS addition for coredata
|| ([thing respondsToSelector:@selector(length)]
&& [(NSData *)thing length] == 0)
|| ([thing respondsToSelector:@selector(count)]
&& [(NSArray *)thing count] == 0);
}
然后,在导入CommonMacros.h后,您可以像这样调用函数:
if (IsEmpty(shotIndex)) {
//do stuff
}
这应该可以解决这个问题,也可以处理字符串、数组等,正如您从代码中看到的。多亏了Wil Shipley!在某些情况下,例如NSUserDefaults中缺少键,您可以将文本@作为空字符串返回 这是我的保险箱号码 注意,首先检查是否为NSNumber,因为NSNumber不理解isEqualToString
id savedPin = [[NSUserDefaults standardUserDefaults] valueForKey:@"blah"]; // don't assume is created so don't type as NSNumber*
if ( ![savedPin isKindOfClass:[NSNumber class]] && [savedPin isEqualToString:@""]) {
这正是我第一次尝试的方法&它不起作用。在我的问题中,您可以看到NSLog为NSNumber提供了什么,其中JSON项为null。这是JSON。如果JSON数据中没有shotIndex,那么它将为nil。然而,正如Pedro所说,shotIndex的值为null,JSON解析器将为您提供一个值e of[NSNull null],而不是nil。将大多数消息发送到[NSNull null]会崩溃,因此这是一个重要的区别。谢谢Wil,这很有用。查看您提供的URL,我认为您已经在其他方面帮助了我:)我说得太快了。如果shoIndex不为空,我想做一些事情,所以我尝试了!IsEmpty(shoIndex)我的NSNumber直接穿过它。嗯,奇怪,那太糟糕了。我建议添加这个IsequalString:@“”测试IsEmpty代码,但首先你问这个问题的原因当然是避开该路径。我已经这么做了,但同意它只是移动了我想要回避的东西。是什么让你认为该对象是
NSNumber
的实例?
id savedPin = [[NSUserDefaults standardUserDefaults] valueForKey:@"blah"]; // don't assume is created so don't type as NSNumber*
if ( ![savedPin isKindOfClass:[NSNumber class]] && [savedPin isEqualToString:@""]) {