Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何检查NSNumber中的空值_Iphone_Null_Compare_Nsnumber - Fatal编程技术网

Iphone 如何检查NSNumber中的空值

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_

首先,我承认我的无知,在我从事项目的几个月里,我学到了关于Objective-C的所有知识。我还发现Objective-C似乎将我使用过的任何其他语言中的简单问题复杂化了,这让我非常沮丧。这个问题就是一个很好的例子

在第一次运行中,我的应用程序下载了一堆JSON,用于填充CoreData存储。我使用Obj-C/JSON库(cjson反序列化器)将JSON转换为nsarray。在一个CoreData实体的JSON下载中,有一个字段包含一个数字(
“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:@""]) {