C # verfügt über eine Syntax, mit der Sie den Argumentindex in einem Zeichenfolgenformatbezeichner angeben können, z.
string message = string.Format("Hello, {0}. You are {1} years old. How does it feel to be {1}?", name, age);
Sie können Argumente mehrmals verwenden und Argumente, die angegeben wurden, nicht verwenden. Eine andere Frage erwähnt die gleiche Formatierung für C / C ++ in Form von %[index]$[format]
z %1$i
. Ich konnte NSString nicht dazu bringen, diese Syntax vollständig zu respektieren, da sie sich gut verhält, wenn Argumente aus dem Format weggelassen werden. Folgendes funktioniert nicht wie erwartet (EXC_BAD_ACCESS, da versucht wird, den age
Parameter als NSObject * zu dereferenzieren ):
int age = 23;
NSString * name = @"Joe";
NSString * message = [NSString stringWithFormat:@"Age: %2$i", name, age];
Die Positionsargumente werden nur berücksichtigt, wenn im Format keine Argumente fehlen (was eine seltsame Anforderung zu sein scheint):
NSString * message = [NSString stringWithFormat:@"Age: %2$i; Name: %1$@", name, age];
Alle diese Aufrufe funktionieren in OS X ordnungsgemäß:
printf("Age: %2$i", [name UTF8String], age);
printf("Age: %2$i %1$s", [name UTF8String], age);
Gibt es eine Möglichkeit, dies mit NSString in Objective-C / Cocoa zu erreichen? Es wäre nützlich für Lokalisierungszwecke.
quelle
Antworten:
NSString und CFString unterstützen nachbestellbare / positionelle Argumente.
Weitere Informationen finden Sie in der Dokumentation unter Apple: String Resources
quelle
stringWithFormat:
Unterstützt Positionsargumente, solange alle Argumente in der Formatzeichenfolge angegeben sind.Der folgende Code behebt den in diesem Problem angegebenen Fehler. Dies ist eine Problemumgehung und nummeriert die Platzhalter neu, um Lücken zu schließen.
quelle
Nach weiteren Recherchen scheint Cocoa die Positionssyntax in zu respektieren
printf
. Daher wäre ein alternatives Muster:Es wäre jedoch schön, wenn dies auf NSString implementiert würde.
quelle
sprintf
ist nicht Teil von Cocoa, sondern Teil der C-Standardbibliothek, und die Implementierung davon iststringWithFormat:
/initWithFormat:
.stringWithFormat:
/initWithFormat:
. Es ist eine separate Implementierung (derzeitCFStringCreateWithFormat
) von der vonsprintf
und Freunden.