null, nill является строковым типом в Objective-C - PullRequest
0 голосов
/ 16 мая 2018
//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 голосов
/ 16 мая 2018

Есть несколько значений, которые отличаются от перспективы Objective C здесь:

  1. nil (иначе null на других языках)
  2. [NSNull null] (специальный объект значения маркера)
  3. @"" (пустая строка)
  4. @"null" (просто строка из 4 символов)

Если вы пишете свой dataDic из своего приложения и знаете, что ваше приложение хорошо с ним справляется, вам не нужно проверять все случаи. Отметьте только те, которые вы ожидаете. Например, если ваше приложение записывает только непустые строки в словарь, но иногда «email» отсутствует, вам нужно только проверить nil, потому что objectForKey возвращает nil, если значение не находится внутри словаря .

С другой стороны, если вы получили dataDic от стороннего API, например, декодированного из JSON, то вам следует выполнить полную проверку:

  1. [NSNull null] помещается в словарь, если JSON имеет null, первоначально как {"email":null}
  2. Если API сервера изменился, вы могли бы получить там другую структуру, чем NSString (хотя здесь это маловероятно).
  3. nil возвращается, если у вас нет ключа / значения вообще.

Вы можете исключить все 3 проверки одновременно, выполнив:

NSString *emailStr = nil;
id emailObj = [dataDic objectForKey:@"email"];
if ([emailObj isKindOfClass:[NSString class]]) {
    emailStr = emailObj;
}

Обратите внимание, что вам может не потребоваться проверять наличие пустой строки или nil перед назначением текста UILabel, поскольку они работают нормально и просто стирают текст метки:

self.emailLbl.text = @"";
self.emailLbl.text = nil; // another way to erase
0 голосов
/ 16 мая 2018

Вы должны проверить, содержит ли ключ @ "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]] для любого объекта.

...