警告“隐式转换失去整数精度......”

时间:2012-01-11 03:28:09

标签: arrays cocoa warnings nstableview

我正在做购物车教程:我有一个数组从文本字段收集输入,然后在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 个答案:

答案 0 :(得分:14)

来自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,它可以正确处理这种情况。

答案 1 :(得分:8)

因为您的变量属于int类型,并且您尝试将类型为NSInteger的变量的值复制到其中。 NSInteger可以包含比int更大的值,因此您可以收到溢出警告。可能最简单的解决方法是将int更改为NSInteger。 (如果要复制变量的值以对其运行测试,通常应使用相同类型的变量。)

答案 2 :(得分:6)

使用

int selectedItemIndex = (int)[shoppingListTableView selectedRow];

而不是

int selectedItemIndex = [shoppingListTableView selectedRow];

答案 3 :(得分:2)

selectedRow:方法返回NSInteger类型的值。

你应该使你的selectedItemIndex类型为NSInteger。

请参阅:

  

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

答案 4 :(得分:1)

使用

   NSInteger selectedItemIndex = [shoppingListTableView selectedRow];

而不是

   int selectedItemIndex = [shoppingListTableView selectedRow];

答案 5 :(得分:1)

您可以更新项目设置,删除所有

Implicit conversion loses integer precision警告,通过设置

Implicit Conversion to 32 Bit TypeNo

在项目的构建设置中。

enter image description here

答案 6 :(得分:0)

我发出警告只是这样做:

int selectedItemIndex = (int)[shoppingListTableView selectedRow];