关于如何抑制/修复 "Implicit conversion changes signedness" 警告的方法

Recipes on how to supress / fix "Implicit conversion changes signedness" warning

我正在对遗留项目进行现代化改造,并在 Xcode 上启用了 -Wconversion 标志。现在我有很多警告,比如

Implicit conversion changes signedness: 'NSUInteger' (aka 'unsigned long') to 'NSInteger' (aka 'long')

在与 UITableView

交互时使用如下代码
Item *item = [self.items objectAtIndex:indexPath.row];

row 定义为 NSIntegerobjectAtIndex: 接受 NSUInteger.

是否有解决这些警告的聪明方法?

通常你不应该试图成为 "smart"。

NSUInteger row = (NSUInteger)indexPath.row;
Item* item = self.items [row];

row 属性 的类型更改为 return NSUInteger 或执行以下操作:

Item *item = [self.items objectAtIndex:(NSUInteger)(indexPath.row)];

如果您选择后者,您可能需要检查以确保 row 是正数。


编辑

由于 rowNSIndexPath 的 属性,所以它可能为负数或者 Apple 将其设为 NSUInteger 显然有充分的理由,也许如果未选择任何项目,则将其设置为 -1。所以你应该做的是确保 row 的值不为负,然后执行上面的强制转换以抑制警告,如下所示:

NSInteger row = indexPath.row
if (row >= 0)
{
    Item *item = [self.items objectAtIndex:(NSUInteger)row];
}
else
{
    // whatever you need to do for no row available
}

升级到 Xcode 11 后,我一直收到此警告。 回到 Xcode 10 解决了这个问题。