Предупреждение: неявное преобразование теряет точность Integer в xcode 6
Я знаю, что это может быть дубликат, но я получил около 30 Неявное преобразование теряет предупреждения Integer precision в моем проекте ios после обновления xcode до версии 6.
Первый пример:
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;
to
int index = indexPath.row / 2i;
Ответы
Ответ 1
NSArray count
NSUInteger
.
NSIndexPath row
- NSInteger
.
В 64-битных системах NSUInteger
и NSInteger
являются 64-битными, а int
- 32-разрядными. Таким образом, значение не будет соответствовать, что приводит к предупреждению.
Лучше избегать int
в iOS. Вместо этого используйте тот же тип, что и значения, с которыми вы имеете дело.
NSInteger index = indexPath.row / 2;
Вероятно, вы видите их в Xcode 6 из-за предупреждений по умолчанию. Вы можете легко увидеть их в Xcode 5 с правильными настройками предупреждения и построить для 64-битного.
Ответ 2
Вы можете обновить настройки проекта, чтобы удалить все
Implicit conversion loses integer precision
, установив
Implicit Conversion to 32 Bit Type
до No
в настройках сборки проекта.
![enter image description here]()
Ответ 3
Меня всегда раздражали эти предупреждения, поэтому я придумал простое решение, чтобы избежать этого:
@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.