Объективное с неявное преобразование теряет целую точность "NSUInteger" (иначе "unsigned long" ) до предупреждения "int"

Я работаю над некоторыми упражнениями и получаю предупреждение о том, что:

неявное преобразование теряет целую точность 'NSUInteger' (aka '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;

}

Screenshot

Ответ 1

Метод count NSArray возвращает NSUInteger, а на платформе 64-разрядной платформы OS X

  • NSUInteger определяется как unsigned long и
  • unsigned long - это 64-разрядное целое без знака.
  • int - это 32-разрядное целое число.

So int является "меньшим" типом данных, чем NSUInteger, поэтому предупреждение компилятора.

См. также NSUInteger в "Справочнике типов базовых данных":

При создании 32-разрядных приложений NSUInteger представляет собой 32-разрядную беззнаковое целое число. 64-разрядное приложение рассматривает NSUInteger как 64-битное беззнаковое целое число.

Чтобы исправить это предупреждение компилятора, вы можете объявить локальную переменную count как

NSUInteger count;

или (если вы уверены, что ваш массив никогда не будет содержать больше элементов 2^31-1!), добавьте явное выражение:

int count = (int)[myColors count];

Ответ 2

В отличие от ответа Мартина, приведение к int (или игнорирование предупреждения) не всегда безопасно, даже если вы знаете, что в вашем массиве не более 2 ^ 31-1 элементов. Не при компиляции для 64-разрядных.

Например:

NSArray *array = @[@"a", @"b", @"c"];

int i = (int) [array indexOfObject:@"d"];
// indexOfObject returned NSNotFound, which is NSIntegerMax, which is LONG_MAX in 64 bit.
// We cast this to int and got -1.
// But -1 != NSNotFound. Trouble ahead!

if (i == NSNotFound) {
    // thought we'd get here, but we don't
    NSLog(@"it not here");
}
else {
    // this is what actually happens
    NSLog(@"it here: %d", i);

    // **** crash horribly ****
    NSLog(@"the object is %@", array[i]);
}

Ответ 3

Изменить ключ в проекте > Настройка сборки " вызовы typecheck для printf/scanf: НЕТ"

Объяснение: [Как это работает]

Проверить вызовы на printf и scanf и т.д., чтобы убедиться, что предоставленные аргументы имеют типы, соответствующие указанной строке формата, и что конверсии, указанные в строке формата, имеют смысл.

Надеюсь, что это сработает

Другое предупреждение

Объективное c неявное преобразование теряет целую точность "NSUInteger" (иначе "unsigned long" ) до "int

Изменить ключ " неявное преобразование в 32Bits Тип > Отладкa > * 64 архитектура: Нет"

[ Предупреждение: Это может аннулировать другое предупреждение об архитектуре 64-битной архитектуры].

Ответ 4

Выполнение экспликации в "int" решает проблему в моем случае. Я была такая же проблема. Итак:

int count = (int)[myColors count];