Предупреждение «Неявное преобразование теряет целочисленную точность ...» - PullRequest
12 голосов
/ 11 января 2012

Я делаю учебник по корзине покупок: у меня есть массив, который собирает входные данные из текстового поля, а затем отображает его в 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 (он же long) вint '.

Почему?

Ответы [ 7 ]

14 голосов
/ 26 января 2012

Из документации 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

ОБНОВЛЕНИЕ:

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

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

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

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

8 голосов
/ 11 января 2012

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

6 голосов
/ 13 марта 2014

Используйте

int selectedItemIndex = (int)[shoppingListTableView selectedRow];

Вместо

int selectedItemIndex = [shoppingListTableView selectedRow];
2 голосов
/ 11 января 2012

selectedRow: метод возвращает значение типа NSInteger.

Вы должны сделать свой selectedItemIndex типа NSInteger.

Пожалуйста, обратитесь к:

http://developer.apple.com/library/mac/ipad/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSTableView_Class/Reference/Reference.html

1 голос
/ 23 января 2015

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

Implicit conversion loses integer precision предупреждения, установив

Implicit Conversion to 32 Bit Type до No

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

enter image description here

1 голос
/ 11 апреля 2013

Используйте

   NSInteger selectedItemIndex = [shoppingListTableView selectedRow];

Вместо

   int selectedItemIndex = [shoppingListTableView selectedRow];
0 голосов
/ 27 января 2014

Я получаю предупреждение, просто сделайте:

int selectedItemIndex = (int)[shoppingListTableView selectedRow];               
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...