关于如何抑制/修复 "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
定义为 NSInteger
而 objectAtIndex:
接受 NSUInteger
.
是否有解决这些警告的聪明方法?
通常你不应该试图成为 "smart"。
NSUInteger row = (NSUInteger)indexPath.row;
Item* item = self.items [row];
将 row
属性 的类型更改为 return NSUInteger
或执行以下操作:
Item *item = [self.items objectAtIndex:(NSUInteger)(indexPath.row)];
如果您选择后者,您可能需要检查以确保 row
是正数。
编辑
由于 row
是 NSIndexPath
的 属性,所以它可能为负数或者 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 解决了这个问题。
我正在对遗留项目进行现代化改造,并在 Xcode 上启用了 -Wconversion
标志。现在我有很多警告,比如
Implicit conversion changes signedness: 'NSUInteger' (aka 'unsigned long') to 'NSInteger' (aka 'long')
在与 UITableView
Item *item = [self.items objectAtIndex:indexPath.row];
row
定义为 NSInteger
而 objectAtIndex:
接受 NSUInteger
.
是否有解决这些警告的聪明方法?
通常你不应该试图成为 "smart"。
NSUInteger row = (NSUInteger)indexPath.row;
Item* item = self.items [row];
将 row
属性 的类型更改为 return NSUInteger
或执行以下操作:
Item *item = [self.items objectAtIndex:(NSUInteger)(indexPath.row)];
如果您选择后者,您可能需要检查以确保 row
是正数。
编辑
由于 row
是 NSIndexPath
的 属性,所以它可能为负数或者 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 解决了这个问题。