Подтвердить что ты не робот

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, на которого он жалуется (граф, который я предполагаю), и почему этот литье не исправляет его?

4b9b3361

Ответ 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]];