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

StackOverflow https://stackoverflow.com/questions/895495

  •  23-08-2019
  •  | 
  •  

Вопрос

Делаю проверку в приложении на айфоне -

int var;
if (var != nil)

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

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

Это было полезно?

Решение

Примитивов быть не может. 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

Другие советы

if (var) {
    ...
}

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

Но у вас есть ошибка:ints не могут быть нулевыми.Это типы значений, как в 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top