C#具有允许您以字符串格式说明符指定参数索引的语法,例如:
string message = string.Format("Hello, {0}. You are {1} years old. How does it feel to be {1}?", name, age);
您可以多次使用参数,也可以省略使用时提供的参数.另一个问题是以%[index]$[format]
例如C/C++的形式提到相同的格式%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);
有没有办法在Objective-C/Cocoa中使用NSString来实现这个目的?它对于本地化目的很有用.
NSString和CFString支持可重新定位/位置参数.
NSString *string = [NSString stringWithFormat: @"Second arg: %2$@, First arg %1$@", @"<1111>", @"<22222>"]; NSLog(@"String = %@", string);
另请参阅Apple的文档:String Resources