Объективное с неявное преобразование теряет целую точность "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];