如何在NSNumber中检查空值

时间:2010-11-20 05:02:38

标签: iphone null compare nsnumber

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

在第一次运行中,我的应用程序下载了一堆用于填充CoreData存储的JSON。我使用Obj-C / JSON库(CJSONDeserializer)将JSON转换为NSArrays。在一个CoreData实体的JSON下载中,有一个字段包含一个数字("show_id":2),用于标识另一个实体中的相关字段(如果有)或null("show_id":null)。在处理该字段时,我使用...

将其分配给NSNumber
NSNumber *shoIndex = [[item objectForKey:typeKey] objectForKey:@"show_id"];

然后我尝试在尝试获取&之前检查我是否有有效号码链接相关记录,以便在没有相关记录的情况下不进行浪费处理。

使用......

询问shoIndex
NSLog(@"shoIndex: %i, %@, %@", shoIndex, shoIndex, [shoIndex description]);

...给出

shoIndex: 19590600, <null>, <null>

其中JSON值为null&amp; ...

shoIndex: 228300880, 51, 51

否则。

到目前为止,我所做的唯一成功检查是......

if (![[shoIndex description] isEqualToString:@"<null>"]) {

有人能建议更好的方法吗?

...更新

以另一种方式shoIndex指定为NSNumber,有时包含NSString@"<null>"。 Obj-C是否有isa运算符,我可以使用它来检查shoIndex的内容类型?

TIA,Pedro。

3 个答案:

答案 0 :(得分:11)

使用[shoObject class]获取对象的类;所以,要测试shoObject的类,你可以使用

[shoObject isKindOfClass:[NSString class]];

一旦你整理出哪些标记定义了一个空字符串或NSNumber,你就可以创建一个宏。我通过将IsEmpty宏保存在名为CommonMacros.h的文件中来做到这一点。这是代码:

//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!

答案 1 :(得分:0)

在某些情况下,例如在NSUserDefaults中丢失密钥,你会收回文字@&#34;&#34;作为一个空字符串。

这是我对NSNumber的安全检查。

注意首先检查它是否为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:@""]) {  

答案 2 :(得分:-1)

在Objective-c中,它nil而不是null。所以:

if (shotIndex != nil) {
   // its not nil
}