null,nill是Objective-C中的字符串类型

时间:2018-05-16 11:21:07

标签: objective-c error-handling runtime-error

//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]

2 个答案:

答案 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观点不同的值:

  1. nil(在其他语言中称为null
  2. [NSNull null](特殊标记值对象)
  3. @""(空字符串)
  4. @"null"(只是一个包含4个字符的字符串)
  5. 如果您从应用中编写dataDic,并且知道您的应用处理得很好,则无需检查所有案例。只检查您期望的那些。例如,如果您的应用仅将非空字符串写入字典,但有时“电子邮件”不存在,则只需检查nil,因为objectForKey会返回nil值不在字典中。

    另一方面,如果您从第三方API获得dataDic,例如从JSON解码,那么您应该进行全面检查:

      如果JSON最初null {"email":null} ,则
    1. [NSNull null]会放在字典中
    2. 如果服务器API发生了变化,你可能会得到一些其他结构而不是NSString(尽管这里不太可能)。
    3. 如果您根本没有密钥/值,则会返回
    4. nil
    5. 您可以通过以下方式一次排除所有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