Предупреждение: неявное преобразование теряет точность 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.