В C # есть синтаксис, который позволяет указать индекс аргумента в спецификаторе строкового формата, например:
string message = string.Format("Hello, {0}. You are {1} years old. How does it feel to be {1}?", name, age);
Вы можете использовать аргументы несколько раз, а также не использовать предоставленные аргументы. В другом вопросе упоминается такое же форматирование для C / C ++ в форме %[index]$[format]
, например %1$i
. Мне не удалось заставить NSString полностью соблюдать этот синтаксис, потому что он хорошо себя ведет при исключении аргументов из формата. Следующее не работает должным образом (EXC_BAD_ACCESS, потому что он пытается разыменовать age
параметр как NSObject *):
int age = 23;
NSString * name = @"Joe";
NSString * message = [NSString stringWithFormat:@"Age: %2$i", name, age];
Позиционные аргументы соблюдаются только в том случае, если в формате нет пропущенных аргументов (что кажется странным требованием):
NSString * message = [NSString stringWithFormat:@"Age: %2$i; Name: %1$@", name, age];
Все эти вызовы правильно работают в OS X:
printf("Age: %2$i", [name UTF8String], age);
printf("Age: %2$i %1$s", [name UTF8String], age);
Есть ли способ сделать это с помощью NSString в Objective-C / Cocoa? Было бы полезно для целей локализации.