//result: ok fine
NSString *email = [dataDic objectForKey:@"email"];
if([email isEqualToString:@"null"])
email = nil;
if((![email length]) == 0)
self.emailLbl.text = email;
// result: not fine
NSString *email = [dataDic objectForKey:@"email"];
if((![email length]) == 0 || (email != nil) )
self.emailLbl.text = email;
在字典中,电子邮件属性值包含空值。我的问题是什么是零的类型? - > if comparison email == nil || email == [NSNull null]
?
答案 0 :(得分:1)
您应该检查密钥@“email”是否包含任何值(如果是字符串)
NSString *email=dic[@"email"];
if (email) {
//do anything with email
}
如果你想检查你的对象是Nil Or Null那么
if (!email || email == (id)[NSNull null]) {
//email unavailable
}
或者,您可以在任何对象上调用[Obj isKindOfClass:[NSNull class]]
。
答案 1 :(得分:1)
这里有几个与Objective-C观点不同的值:
nil
(在其他语言中称为null
)[NSNull null]
(特殊标记值对象)@""
(空字符串)@"null"
(只是一个包含4个字符的字符串)如果您从应用中编写dataDic
,并且知道您的应用处理得很好,则无需检查所有案例。只检查您期望的那些。例如,如果您的应用仅将非空字符串写入字典,但有时“电子邮件”不存在,则只需检查nil
,因为objectForKey
会返回nil
值不在字典中。
另一方面,如果您从第三方API获得dataDic
,例如从JSON解码,那么您应该进行全面检查:
null
{"email":null}
,则nil
。您可以通过以下方式一次排除所有3项检查:
NSString *emailStr = nil;
id emailObj = [dataDic objectForKey:@"email"];
if ([emailObj isKindOfClass:[NSString class]]) {
emailStr = emailObj;
}
请注意,在分配给UILabel文本之前,您可能不必检查空字符串或nil,因为这些工作正常并且只是擦除标签文本:
self.emailLbl.text = @"";
self.emailLbl.text = nil; // another way to erase