Предупреждение "Неявное преобразование теряет целую точность..."
Я делаю учебник по корзине покупок: у меня есть массив, который собирает ввод из текстового поля, а затем отображает его в 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];
Ответ 4
Выбранный метод Row: возвращает значение типа NSInteger.
Вы должны сделать свой selectedItemIndex типа NSInteger.
Обратитесь к:
http://developer.apple.com/library/mac/ipad/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSTableView_Class/Reference/Reference.html
Ответ 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];