Teste para nil em Objective-C – if (x! = Nil) vs if (x)

A maioria dos exemplos que encontrei na net escreve isto:

if(x != nil) // ... 

Existe algum problema com isso?

 if(x) // ... 

Eu tentei ambos em um programa simples e não encontrei nenhuma diferença.

Em Objective-C, nil é definido como um valor chamado __DARWIN_NULL , que essencialmente é avaliado como 0 ou false em instruções if. Portanto, escrever if (x == nil) é o mesmo que escrever if (!x) e escrever if (x != nil) é igual a if (x) (já que comparar com false cria uma negação e comparar com true keeps a condição é a mesma).


Você pode escrever seu código de qualquer maneira, e isso realmente depende do que você acha que é mais legível. Eu acho if (x) faz mais sentido, mas depende do seu estilo.

É como comparar if (someCondition == true) versus if (someCondition) .
Tudo depende de você e quem vai ler o código.


Editar: Como Yuji menciona corretamente, desde que Objective-C é um superconjunto de C, qualquer condição que avalia um valor diferente de 0 é considerada verdadeira e, portanto, se someCondition no exemplo acima fosse para avaliar um valor inteiro de Por exemplo, -1, comparando com true resultaria em false , e a declaração if não seria avaliada. Algo para estar ciente.

Ambos

 if (x != nil) 

e

 if ( x ) 

são equivalentes, então escolha a variante que, na sua opinião, torna seu código mais legível para você (e para outras pessoas que lerão e darão suporte ao seu código)

Ambos são os mesmos e isso é uma questão de estilo e se resume a se você prefere:

  1. Se algo) { … }

    versus

  2. if (alguma coisa! = nada) {…}

Eu sempre achei o # 1 mais claro, mas o # 2 é usado extensivamente na documentação e, portanto, no campo, por isso é melhor conhecer as duas formas e adaptar-se ao que um projeto usa e ser estilisticamente consistente.

A melhor e mais segura maneira de verificar nulo é
Faça um método comum e adicione todos esses null :

 + (NSString *)trimWhiteSpaceAndNewLine:(NSString *)string { NSString *stringSource = [NSString stringWithFormat:@"%@",string]; if ([stringSource isEqualToString:@"(null)"]) { stringSource = @""; return stringSource; } if ([stringSource isEqualToString:@""]) { stringSource = @""; return stringSource; } if ([stringSource isEqualToString:@""]) { stringSource = @""; return stringSource; } if ([stringSource isKindOfClass:[NSNull class]]) { stringSource = @""; return stringSource; } if ([stringSource isEqualToString:@""]) { stringSource = @""; return stringSource; } if (stringSource == nil) { stringSource = @""; return stringSource; } NSString *stringFinal = [stringSource stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; return stringFinal; } 

E verifique

 NSString *strUuid = [Common trimWhiteSpaceAndNewLine:[dict valueForKeyPath:@"detail.uuid"]]; if (![strUuid isEqualToString:@""]) { // do your stuff } 
 if([yourNullObject isKindOfClass:[NSNull class]]){ //if it is null }else{ //if it is not null }