Я работаю над некоторыми упражнениями и получил предупреждение, в котором говорится:
Неявное преобразование теряет целочисленную точность: «NSUInteger» (он же «unsigned long») в «int»
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
@autoreleasepool {
NSArray *myColors;
int i;
int count;
myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];
count = myColors.count; // <<< issue warning here
for (i = 0; i < count; i++)
NSLog (@"Element %i = %@", i, [myColors objectAtIndex: i]);
}
return 0;
}
Вопреки ответу Мартина, приведение к int (или игнорирование предупреждения) не всегда безопасно, даже если вы знаете, что в вашем массиве не более 2 ^ 31-1 элементов. Не при компиляции для 64-битной.
Например:
источник
indexOfObject:
было бы плохой идеей. Мой ответ был предназначен для конкретного кода в вопросе, иcount
метод не может вернутьсяNSNotFound
. Я не рекомендовал приводить к int или вообще игнорировать предупреждения. Извините, если это было неясно. На самом деле ваш пример кода будет генерировать предупреждение при егоif (i == NSNotFound)
компиляции для 64-битной системы, поэтому проблема не останется незамеченной.Изменить ключ в Project> Build Setting " typecheck вызывает printf / scanf : НЕТ "
Пояснение: [Как это работает]
Проверьте вызовы printf, scanf и т. Д., Чтобы убедиться, что предоставленные аргументы имеют типы, соответствующие указанной строке формата, и что преобразования, указанные в строке формата, имеют смысл.
Надеюсь это сработает
Другое предупреждение
неявное преобразование target c теряет целочисленную точность «NSUInteger» (иначе «unsigned long») в «int»
Изменить ключ « неявное преобразование в 32-битный тип> Отладка> * 64 архитектура: нет »
[ предостережение: это может аннулировать другое предупреждение о преобразовании 64-битной архитектуры] .
источник
Выполнение точного преобразования в int решает проблему в моем случае. Я была такая же проблема. Так:
источник