【问题标题】:How to check for null value in NSNumber如何检查 NSNumber 中的空值
【发布时间】:2010-11-20 05:02:37
【问题描述】:

首先我承认我的无知,在我从事项目的几个月里,我学到了关于 Objective-C 的一切知识。我还发现,Objective-C 似乎使我使用过的任何其他语言中的简单问题变得复杂,这完全令人沮丧。这个问题就是一个例子……

在第一次运行时,我的应用程序下载了一堆 JSON,用于填充 CoreData 存储。我使用 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 &...

shoIndex: 228300880, 51, 51

否则。

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

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

谁能提出更好的方法?

更新...

以另一种方式看待shoIndex 被分配为NSNumber,有时包含NSString@"&lt;null&gt;"。 Obj-C 是否有类似 isa 的运算符,可以用来检查 shoIndex 的内容类型?

TIA,佩德罗。

【问题讨论】:

  • 是什么让你认为对象是NSNumber的实例?

标签: iphone null compare nsnumber


【解决方案1】:

使用[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
}

这应该可以解决这个问题,并且也适用于字符串、数组等,正如您从代码中看到的那样。感谢威尔·希普利!

【讨论】:

  • 谢谢威尔,这是一种享受。查看您在此处提供的 URL,我认为您已经在其他方面帮助了我 :)
  • 我说得太早了。如果 shoIndex 不为空,我想做一些事情,所以我尝试了 !IsEmpty(shoIndex) 并且我的 NSNumber 直飞。
  • 嗯,奇怪,这太糟糕了。我建议将此 isEqualToString:@"" 测试添加到 IsEmpty 代码中,但当然避开这条路线是您首先提出这个问题的原因。
  • 我已经这样做了,但我同意这只是在移动我想躲避的东西。
【解决方案2】:

在某些情况下,例如 NSUserDefaults 中缺少键,您会以空字符串的形式返回文字 @""。

这是我对 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:@""]) {  

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 这正是我第一次尝试的方法,但没有成功。您在我的问题中看到 的地方是 NSLog 为 JSON 项目为空的 NSNumber 提供的内容。
    • 这是 JSON。如果 JSON 数据中不存在 shotIndex,那么它将为零。然而,正如 Pedro 所说,shotIndex 的值为 null,JSON 解析器将为您提供 [NSNull null] 的值,而不是 nil。将大多数消息发送到 [NSNull null] 会崩溃,因此这是一个重要的区别。
    猜你喜欢
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多