web-dev-qa-db-fra.com

Test de zéro dans Objective-C - if (x! = Nil) vs if (x)

La plupart des exemples que j'ai trouvés sur le net écrivent ceci:

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

Y a-t-il des problèmes avec cela?

if(x)
    // ...

J'ai essayé les deux dans un programme simple et je n'ai trouvé aucune différence.

71
kizzx2

Dans Objective-C, nil est défini comme une valeur appelée __DARWIN_NULL, Qui s'évalue essentiellement à 0 Ou false dans les instructions if. Par conséquent, écrire if (x == nil) est identique à écrire if (!x) et écrire if (x != nil) est égal à if (x) (puisque comparé à false crée une négation et la comparaison avec true conserve la même condition).


Vous pouvez écrire votre code de toute façon, et cela dépend vraiment de ce que vous pensez être le plus lisible. Je trouve que if (x) a plus de sens, mais cela dépend de votre style.

C'est comme comparer if (someCondition == true) et if (someCondition).
Tout dépend de vous, et de qui va lire le code.


Edit: Comme Yuji le mentionne correctement, puisque Objective-C est un surensemble de C, toute condition qui évalue à une valeur autre que 0 est considérée comme vraie, et donc, si someCondition dans l'exemple ci-dessus devait être évalué à une valeur entière de, disons -1, la comparer à true entraînerait false, et l'instruction if ne serait pas évaluée. Quelque chose à savoir.

123
Itai Ferber

Tous les deux

if (x != nil)

et

if ( x )

sont équivalents, alors choisissez la variante qui, à votre avis, rend votre code plus lisible pour vous (et les autres qui liront et prendront en charge votre code)

8
Vladimir

Les deux sont les mêmes et c'est une question de style et cela se résume à savoir si vous préférez:

  1. si quelque chose) { ... }

    versus

  2. si (quelque chose! = rien) {...}

J'ai toujours trouvé le n ° 1 plus clair, mais le n ° 2 est largement utilisé dans la documentation et donc le domaine, il est donc préférable de connaître les deux formes et de s'adapter à ce qu'un projet utilise et d'être stylistiquement cohérent.

0
Dulio Denis

Le moyen le plus sûr et le plus sûr de vérifier zéro est
Créez une méthode commune et ajoutez tous ces null:

+ (NSString *)trimWhiteSpaceAndNewLine:(NSString *)string {
    NSString *stringSource = [NSString stringWithFormat:@"%@",string];
    if ([stringSource isEqualToString:@"(null)"]) {
        stringSource = @"";
        return stringSource;
    }
    if ([stringSource isEqualToString:@"<null>"]) {
        stringSource = @"";
        return stringSource;
    }
    if ([stringSource isEqualToString:@"<nil>"]) {
        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;
}  

Et vérifie

NSString *strUuid = [Common trimWhiteSpaceAndNewLine:[dict valueForKeyPath:@"detail.uuid"]];
        if (![strUuid isEqualToString:@""]) {
            // do your stuff
        }
0
Mihir Oza