Ped*_*dro 5 iphone null compare nsnumber
首先,我承认自己的无知,在我参与项目的几个月里,我已经学会了所有关于Objective-C的知识.我还发现Objective-C似乎使我用过的任何其他语言中的简单问题变得复杂,这让我感到非常沮丧.这个问题就是一个例子......
在第一次运行中,我的应用程序下载了一堆JSON,用于填充CoreData存储.我使用Obj-C/JSON库(CJSONDeserializer)将JSON转换为NSArrays.在一个CoreData实体的JSON下载中,有一个字段包含一个数字("show_id":2)标识另一个实体中的相关字段(如果有)或"show_id":null否则为null().在处理该字段时,我使用...将其分配给NSNumber
NSNumber *shoIndex = [[item objectForKey:typeKey] objectForKey:@"show_id"];
Run Code Online (Sandbox Code Playgroud)
然后我尝试在尝试获取和链接相关记录之前检查我是否有有效号码,以便在没有相关记录的情况下不进行浪费处理.
讯问shoIndex......
NSLog(@"shoIndex: %i, %@, %@", shoIndex, shoIndex, [shoIndex description]);
Run Code Online (Sandbox Code Playgroud)
给...
shoIndex: 19590600, <null>, <null>
Run Code Online (Sandbox Code Playgroud)
其中JSON值是null&...
shoIndex: 228300880, 51, 51
Run Code Online (Sandbox Code Playgroud)
除此以外.
到目前为止,我所做的唯一成功检查是......
if (![[shoIndex description] isEqualToString:@"<null>"]) {
Run Code Online (Sandbox Code Playgroud)
有谁能建议更好的方法?
更新中...
另一种方式shoIndex是将其指定为NSNumber有时包含NSString值的方式@"<null>".Obj-C是否有类似isa操作符的东西,我可以用它来检查内容的类型shoIndex?
TIA,Pedro.
Sam*_*hie 11
使用[shoObject class]来获取类对象的; 所以,为了测试shoObject课程,你会使用
[shoObject isKindOfClass:[NSString class]];
Run Code Online (Sandbox Code Playgroud)
一旦你整理出哪些标记定义了一个空字符串或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);
}
Run Code Online (Sandbox Code Playgroud)
然后,在导入CommonMacros.h之后,您可以像这样调用函数:
if (IsEmpty(shotIndex)) {
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
这应该解决这个问题,并且还可以处理字符串,数组等,正如您可以从代码中看到的那样.感谢Wil Shipley!