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

jan*_*neh 12 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];
}
Run Code Online (Sandbox Code Playgroud)

在第2行(int selectedItemIndex...)()我得到一个黄色警告:隐式转换失去整数精度:'NSInteger'(又名'long')到'int'.

为什么?

Fan*_*aan 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
Run Code Online (Sandbox Code Playgroud)

更新:

详细解释:

[shoppingListTableView selectedRow]返回一个NSInteger,你正在构建一个64位的应用程序,所以它实际上是一个long.

您可以使用long selectedItemIndex而不是int selectedItemIndex禁止此警告,但在构建32位版本时会再次出现警告.

更好的方法是使用NSInteger selectedItemIndex,正确处理这种情况.

  • @KunalBalani和justicepenny您不应该尝试将此代码添加到您的项目中.这仅显示了如何在内部定义NSInteger. (2认同)

Dav*_*rtz 8

因为您的变量属于类型,int并且您尝试将类型变量的值复制NSInteger到其中.一个NSInteger可以比保持较大的值int就可以了,所以你得到一个警告溢出是可能的.可能最简单的解决方法是int改为NSInteger.(如果要复制变量的值以对其运行测试,通常应使用相同类型的变量.)

  • 如果写书的人都是优秀的程序员,他们就会发送产品而不是书籍!:) (8认同)
  • 可能是由于一些工具的变化.默认情况下,项目现在使用LLVM/Clang作为编译器和静态分析器,与之前的Xcode版本一样,选择的编译器是gcc.LLVM能够提供更好的反馈. (2认同)

Siv*_*iva 6

使用

int selectedItemIndex = (int)[shoppingListTableView selectedRow];
Run Code Online (Sandbox Code Playgroud)

代替

int selectedItemIndex = [shoppingListTableView selectedRow];
Run Code Online (Sandbox Code Playgroud)