首先我承认了我的无知,在我参与项目的几个月里,我已经学会了所有关于Objective-C的知识。我还发现Objective-C似乎使我用过的任何其他语言中的简单问题变得复杂,这让我感到非常沮丧。这个问题就是一个例子......
在第一次运行中,我的应用程序下载了一堆用于填充CoreData存储的JSON。我使用Obj-C / JSON库(CJSONDeserializer)将JSON转换为NSArrays。在一个CoreData实体的JSON下载中,有一个字段包含一个数字("show_id":2
),用于标识另一个实体中的相关字段(如果有)或null("show_id":null
)。在处理该字段时,我使用...
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。
答案 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
}