Правильно ли это утверждение или оно избыточно? - PullRequest
2 голосов
/ 20 августа 2011

У меня простой вопрос об утверждении if в Objective - C.

Это правильное утверждение, или оно избыточно, и мне не нужно указывать == ДА?

NSNumber *boolean = [NSNumber numberWithBool:YES];
if (boolean == YES) ...

спасибо

Ответы [ 3 ]

5 голосов
/ 20 августа 2011

Вы сравниваете указатель и целое число, которое не приведет вас к желаемому результату.

Пример:

NSNumber *boolean1 = [NSNumber numberWithBool:YES];
if (boolean1) {
    // true
}

NSNumber *boolean2 = [NSNumber numberWithBool:NO];
if (boolean2) {
    // this is also true
}

if ([boolean1 boolValue] && ![boolean2 boolValue]) {
    // true
}
2 голосов
/ 20 августа 2011

Нет, это не правильно и не будет генерировать результат, который вы думаете, что это так. NSNumber * boolean - указатель на объект в памяти, а YES - скалярное значение; их не следует сравнивать с ==.

Если вы введете этот код, вы также получите следующее предупреждение:

warning from comparison

Правильный способ сделать это будет:

NSNumber *boolean = [NSNumber numberWithBool:YES];
if ( [boolean boolValue] ) {
  // do something
}

Но само это утверждение не имеет особого смысла, поскольку вы должны сравнивать BOOL s, а не NSNumber - нет необходимости использовать NSNumber там.

0 голосов
/ 20 августа 2011

Это не сработает. Экземпляр NSBoolean является объектом и будет отличным от NULL, YES или NO.

Есть два хороших способа проверить значение NSBoolean.

Первый - использовать boolValue:

NSNumber *boolean = [NSNumber numberWithBool:YES];
if ([boolean boolValue] == YES) ...
if ([boolean boolValue]) ... // simpler

Второе - использовать идентификатор возвращаемого объекта:

NSNumber *boolean = [NSNumber numberWithBool:YES];
if (boolean == (id)kCFBooleanTrue) ...

Последнее быстрее; он основан на том, что в системе есть только один из NSBoolean YES и NSBoolean NO. Они имеют те же значения, что и kCFBooleanTrue и kCFBooleanFalse. Я читал, что это безопасно навсегда, но я не уверен, что это часть опубликованной документации Apple.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...