Предупреждение "Неявное преобразование теряет целую точность..."

Я делаю учебник по корзине покупок: у меня есть массив, который собирает ввод из текстового поля, а затем отображает его в NSTableView. Вы можете проверить элемент и удалить его из списка. Я хочу отображать предупреждение только в том случае, если что-то проверено. Итак, у меня есть это:

    -(IBAction)removeItemFromShoppingList:(id)sender {
        int selectedItemIndex = [shoppingListTableView selectedRow];
        if (selectedItemIndex == -1) return;
        NSAlert *alert = [[NSAlert alloc] init];
        ...
        [alert runModal];
        [alert release];
}

В строке 2 здесь (int selectedItemIndex...) появляется желтое предупреждение: Неявное преобразование теряет целую точность: NSInteger (aka 'long) до' int.

Почему?

Ответ 1

Из документации Apple:

При создании 32-разрядных приложений NSInteger представляет собой 32-разрядное целое число. 64-разрядное приложение рассматривает NSInteger как 64-битное целое число.

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
#else
typedef int NSInteger;
#endif

UPDATE:

Объясните подробнее:

[shoppingListTableView selectedRow] возвращает NSInteger, и вы создаете 64-битное приложение, поэтому на самом деле это long.

Вы можете использовать long selectedItemIndex вместо int selectedItemIndex для подавления этого предупреждения, но при создании 32-разрядной версии это предупреждение появляется снова.

Лучше использовать NSInteger selectedItemIndex, который правильно обрабатывает этот случай.

Ответ 2

Поскольку ваша переменная имеет тип int, и вы пытаетесь скопировать значение переменной типа NSInteger в нее. NSInteger может содержать большие значения, чем int can, поэтому вы получаете предупреждение о том, что переполнение возможно. Вероятно, самым простым решением является изменение int на NSInteger. (Если вы хотите скопировать значение переменной для запуска тестов на ней, вы должны обычно использовать переменную того же типа.)

Ответ 3

Использование

int selectedItemIndex = (int)[shoppingListTableView selectedRow];

Вместо

int selectedItemIndex = [shoppingListTableView selectedRow];

Ответ 5

Использование

   NSInteger selectedItemIndex = [shoppingListTableView selectedRow];

Вместо

   int selectedItemIndex = [shoppingListTableView selectedRow];

Ответ 6

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

Implicit conversion loses integer precision, установив

Implicit Conversion to 32 Bit Type до No

в настройках сборки проекта.

enter image description here

Ответ 7

Я получаю предупреждение:

int selectedItemIndex = (int)[shoppingListTableView selectedRow];