web-dev-qa-db-ja.com

Objective-Cでのnilのテスト-if(x!= nil)vs if(x)

私がネットで見つけたほとんどの例はこれを書いています:

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

これに何か問題はありますか?

if(x)
    // ...

単純なプログラムで両方を試しましたが、違いは見つかりませんでした。

71
kizzx2

Objective-Cでは、nilは___DARWIN_NULL_と呼ばれる値として定義され、基本的にif文では_0_またはfalseに評価されます。したがって、if (x == nil)の書き込みはif (!x)の書き込みと同じであり、if (x != nil)の書き込みはif (x)と同じです(falseと比較するため)否定を作成し、trueと比較すると条件が同じに保たれます。


どちらの方法でもコードを書くことができますが、それは本当に読みやすいと思うものに依存します。 if (x)がより理にかなっていると思いますが、それはあなたのスタイルに依存します。

if (someCondition == true)if (someCondition)を比較するようなものです。
それはすべてあなた次第で、誰がコードを読むかによって異なります。


編集: Yujiが正しく言及しているように、Objective-CはCのスーパーセットであるため、0以外の値に評価される条件はすべて真であると見なされ、したがってsomeConditionが上記の例では、たとえば-1の整数値に評価し、trueと比較するとfalseになり、ifステートメントは評価されません。知っておくべきこと。

123
Itai Ferber

両方

if (x != nil)

そして

if ( x )

同等なので、あなたの意見であなたのコードをより多くするバリアントを選んでください読みやすいあなた(そしてあなたのコードを読んでサポートする他の人)

8
Vladimir

両方とも同じであり、これはスタイルの質問であり、それはあなたが好むかどうかに要約されます:

  1. もし何か) { ... }

    versus

  2. if(something!= nothing){...}

私は常に#1をより明確に見つけましたが、#2はドキュメントで広く使用されており、したがってフィールドで使用されるため、両方のフォームを理解し、プロジェクトが使用するものに適合し、スタイル的に一貫していることが望ましいです。

0
Dulio Denis

Nilをチェックする最良かつ安全な方法は
共通のメソッドを作成し、これらすべてを追加します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;
}  

そしてチェック

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