Тестирование для nil в Objective-C - if (x!= Nil) vs if (x)

Большинство примеров, которые я нашел в сети, пишут это:

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

Есть ли проблемы с этим?

if(x)
    // ...

Я пробовал как в простой программе, так и не мог найти разницы.

Ответ 1

В Objective-C nil определяется как значение, называемое __DARWIN_NULL, которое по существу оценивает 0 или false в if-statement. Поэтому, написание if (x == nil) совпадает с записью if (!x), а запись if (x != nil) равна if (x) (поскольку сравнение с false создает отрицание, а сравнение с true сохраняет условие одинаковое).


Вы можете написать свой код в любом случае, и это действительно зависит от того, что вы считаете более читаемым. Я нахожу if (x), чтобы иметь больше смысла, но это зависит от вашего стиля.

Это похоже на сравнение if (someCondition == true) и if (someCondition).
Все зависит от вас, и кто будет читать код.


Изменить: Как правильно упоминает Юдзи, так как Objective-C является надмножеством C, любое условие, которое оценивает значение, отличное от 0, считается истинным, и, следовательно, если someCondition в приведенном выше примере нужно было оценить целочисленное значение, скажем, -1, сравнив его с true, приведет к false, и оператор if не будет оцениваться. Что-то нужно знать.

Ответ 2

И

if (x != nil)

и

if ( x )

эквивалентны, поэтому выберите вариант, который, по вашему мнению, сделает ваш код более удобочитаемым для вас (и других, кто будет читать и поддерживать ваш код)

Ответ 3

Оба одинаковые, и это вопрос стиля, и это сводится к тому, предпочитаете ли вы:

  • if (something) {...}

    против

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

Я всегда нашел # 1 более понятным, но # 2 широко используется в документации и, следовательно, в поле, поэтому лучше знать обе формы и адаптироваться к тому, что использует проект, и быть стилистически последовательным.

Ответ 4

Лучший и безопасный способ проверить нуль
Сделайте общий метод и добавьте все эти значения:

+ (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
        }

Ответ 5

if([yourNullObject isKindOfClass:[NSNull class]]){
    //if it is null
}else{
    //if it is not null
}