objective-c - loses - swift string format specifiers




Почему только NSLog предупреждает меня об использовании спецификатора формата строки% lu для NSUInteger? (2)

По какой-то причине я получаю ошибку компиляции при попытке сделать следующее:

NSLog(@"row: %lu", indexPath.row);

где row имеет тип NSUInteger . Я получаю ошибку

Преобразование указывает тип «unsigned long», но аргумент имеет тип «NSUInteger» (он же «unsigned int»)

Я могу сделать следующее без ошибок компиляции:

NSString * string = [NSString stringWithFormat:@"row: %lu", indexPath.row];

Я использую одну и ту же строку формата и аргумент замещения в обоих случаях, но почему NSLog -stringWithFormat: , пока -stringWithFormat: кажется, совершенно доволен? Мой компилятор LLVM 1.6.


В документации Apple рекомендуется преобразовывать 64-битное значение в 32-битное с использованием% lu и% ld. Это создает проблему, если вы действительно используете дополнительные 32 бита. Строки формата% qu и% qd задают 64-битное значение (без знака и со знаком соответственно). Если вам нужен код, который будет компилироваться в любом режиме, то значения, объявленные как NSUInteger или NSInteger, должны быть преобразованы в UInt64 или SInt64 в списке параметров, чтобы избежать предупреждения.


Все устройства, на которых работает iOS, являются 32-битными. Если вы хотите заставить замолчать предупреждение:

NSLog(@"row: %lu", (unsigned long)indexPath.row);

[Редактировать: Что касается iPhone 5s, больше не правда, что iOS всегда 32-битная.]