NSUInteger не следует использовать в строках формата?
Вот мой код во всем этом слава:
[NSString stringWithFormat:@"Total Properties: %d", (int)[inArray count]];
Что вызывает предупреждение Xcode 5.1:
Values of type 'NSUInteger' should not be used as format arguments; add an explicit cast to 'unsigned long' instead
Хорошо, я смущен. Значение действительно 32-битное int, и я передал его 32-битной int. Так что же это NSUInteger, на которого он жалуется (граф, который я предполагаю), и почему этот литье не исправляет его?
Ответы
Ответ 1
NSUInteger и NSInteger имеют разную длину в 32-битных (int) и 64-битных (длинных). Чтобы один спецификатор формата работал для обеих архитектур, вы должны использовать длинный спецификатор и задать значение long:
Type Format Specifier Cast
---- ---------------- ----
NSInteger %ld long
NSUInteger %lu unsigned long
Итак, например, ваш код будет выглядеть следующим образом:
[NSString stringWithFormat:@"Total Properties: %lu", (unsigned long)[inArray count]];
На самом деле очень мало работы, потому что функция Xcode Fix-It сделает это автоматически.
Ответ 2
Также возможно использовать модификаторы "z" и "t" для строк формата, не зависящих от ЦП, например
NSInteger x = -1;
NSUInteger y = 99;
NSString *foo = [NSString stringWithFormat:@"NSInteger: %zd, NSUInteger: %tu", x, y];
Ответ 3
Основной тип NSUInteger
изменяется на основе платформы: это 32-разрядное целое без знака на 32-битных платформах и 64-разрядное целое без знака на 64-разрядных платформах.
В разделе "Зависимости платформы" руководства по программированию по струнам Apple предлагает сделать следующее:
Чтобы избежать необходимости использовать разные типы спецификаций типа printf в зависимости от платформы, вы можете использовать спецификаторы, показанные в таблице 3. Обратите внимание, что в некоторых случаях вам может понадобиться указать значение.
Для NSUInteger
используйте формат %lu
или %lx
и введите значение unsigned long
.
Следовательно, ваш код необходимо изменить следующим образом, чтобы избежать предупреждения:
[NSString stringWithFormat:@"Total Properties: %lu", (unsigned long)[inArray count]];
Ответ 4
Вы также можете попробовать использовать методы NSNumber:
[NSString stringWithFormat:@"Total Properties: %@", [[NSNumber numberWithUnsignedInteger:[inArray count]] stringValue]];