С# имеет синтаксис, который позволяет указать индекс аргумента в спецификаторе формата строки, например:
string message = string.Format("Hello, {0}. You are {1} years old. How does it feel to be {1}?", name, age);
Вы можете использовать аргументы более одного раза и также опускать аргументы, которые предоставляются от использования. Другой вопрос упоминает одно и то же форматирование для 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: %[email protected]", name, age];
Все эти вызовы работают правильно в OS X:
printf("Age: %2$i", [name UTF8String], age);
printf("Age: %2$i %1$s", [name UTF8String], age);
Есть ли способ выполнить это, используя NSString в Objective-C/Cocoa? Это было бы полезно для целей локализации.