5

首先我承认我的无知,在我从事项目的几个月里,我学到了关于 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值的 a @"<null>"。Obj-C 是否有类似isa运算符之类的东西,我可以用它来检查内容的类型shoIndex

TIA,佩德罗。

4

3 回答 3

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
}

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

于 2010-11-20T05:11:30.607 回答
0

在某些情况下,例如 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:@""]) {  
于 2014-12-13T03:17:17.930 回答
-1

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

if (shotIndex != nil) {
   // its not nil
}
于 2010-11-20T05:06:43.730 回答