Как проверить, является ли примитив в Objective-C нулевым?

Я делаю проверку в приложении для iPhone -

int var;
if (var != nil)

Это работает, но в X-Code это генерирует предупреждение «сравнение между указателем и целым числом». Как это исправить?

Я родом из мира Java, где я почти уверен, что приведенное выше утверждение не будет выполнено при компиляции.


person bpapa    schedule 21.05.2009    source источник


Ответы (2)


Примитивы не могут быть nil. nil зарезервировано для указателей на объекты Objective-C. nil технически является типом указателя, и смешивание указателей и целых чисел без приведения почти всегда приводит к предупреждению компилятора, за одним исключением: совершенно нормально неявно преобразовывать целое число 0 в указатель без приведения.

Если вы хотите различать 0 и «нет значения», используйте NSNumber:

NSNumber *num = [NSNumber numberWithInt:0];
if(num == nil)  // compare against nil
    ;  // do one thing
else if([num intValue] == 0)  // compare against 0
    ;  // do another thing
person Adam Rosenfield    schedule 21.05.2009

if (var) {
    ...
}

Добро пожаловать в чудесный мир C. Любое значение, не равное целому 0 или нулевому указателю, является истинным.

Но у вас есть ошибка: целые числа не могут быть нулевыми. Это типы значений, как и в Java.

Если вы хотите «упаковать» целое число, вам нужно запросить его адрес:

int can_never_be_null = 42; // int in Java
int *can_be_null = &can_never_be_null; // Integer in Java
*can_be_null = 0; // Integer.set or whatever
can_be_null = 0;  // This is setting "the box" to null,
                  //  NOT setting the integer value
person Frank Krueger    schedule 21.05.2009
comment
все, кажется, работает, хотя, где случай, когда это вызвало бы у меня проблемы? просто для некоторого фона - var - это свойство в объекте домена. В одном из моих ViewController есть UISegmentedViewController, который используется для установки значения var. Таким образом, до того, как пользователь что-либо выберет, переменная var еще не установлена. - person bpapa; 22.05.2009
comment
var == 0, если он еще не установлен - person ; 22.05.2009
comment
Конечно, он был установлен - он был установлен на неопределенное значение. ints может только принимать целочисленные значения. Вы должны сравнивать с 0 или использовать отдельный флаг BOOL, чтобы определить/обозначить, является ли var действительным. - person Frank Krueger; 22.05.2009