我知道它可能是重复的,但是在将xcode更新为版本6之后,我的ios项目中有大约30个隐式转换失去了整数精度警告。
第一个例子:
NSArray * stations = [self stationsJSON][KEY_ITEM_LIST];
int newSize = (stations.count + 1); // Implicit conversion loses Integer precision: 'unsigned long' to 'int'
第二个例子:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...
int index = indexPath.row / 2; // Implicit conversion loses Integer precision: 'long' to 'int'
...
}
我知道警告意味着什么。使用NSInteger可以帮助避免此警告。
我不明白,为什么xcode 5中没有警告?为什么我改变线后没有警告
int index = indexPath.row / 2;
到
int index = indexPath.row / 2i;
答案 0 :(得分:35)
您可以更新项目设置,删除所有
Implicit conversion loses integer precision
警告,通过设置
Implicit Conversion to 32 Bit Type
至No
在项目的构建设置中。
答案 1 :(得分:22)
NSArray count
是NSUInteger
。
NSIndexPath row
是NSInteger
。
在64位系统上,NSUInteger
和NSInteger
为64位,int
为32位。因此,该值不适合导致警告的结果。
最好避免使用iOS中的int
。而是使用与您正在处理的值相同的类型。
NSInteger index = indexPath.row / 2;
由于默认警告,您可能会在Xcode 6中看到这些内容。您可以使用正确的警告设置在Xcode 5中轻松查看这些内容并构建为64位。
答案 2 :(得分:0)
我总是对这些警告感到恼火,所以我想出了一个简单的解决方案来避免它:
@interface NSIndexPath(UnsignedIndex)
@property (nonatomic, readonly) NSUInteger sectionIndex;
@property (nonatomic, readonly) NSUInteger rowIndex;
@end
@implementation NSIndexPath(UnsignedIndex)
- (NSUInteger)sectionIndex {
return (NSUInteger)self.section;
}
- (NSUInteger)rowIndex {
return (NSUInteger)self.row;
}
@end
只需使用此类别中的rowIndex
和sectionIndex
属性,而不是NSIndexPath的行和部分属性。