有没有办法在NSString stringWithFormat中指定参数位置/索引?

Jas*_*son 77 cocoa objective-c

C#具有允许您以字符串格式说明符指定参数索引的语法,例如:

string message = string.Format("Hello, {0}. You are {1} years old. How does it feel to be {1}?", name, age);
Run Code Online (Sandbox Code Playgroud)

您可以多次使用参数,也可以省略使用时提供的参数.另一个问题是以%[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];
Run Code Online (Sandbox Code Playgroud)

只有在格式中没有缺少参数时才会遵守位置参数(这似乎是一个奇怪的要求):

NSString * message = [NSString stringWithFormat:@"Age: %2$i; Name: %1$@", name, age];
Run Code Online (Sandbox Code Playgroud)

所有这些调用在OS X中都能正常工作:

printf("Age: %2$i", [name UTF8String], age);
printf("Age: %2$i %1$s", [name UTF8String], age);
Run Code Online (Sandbox Code Playgroud)

有没有办法在Objective-C/Cocoa中使用NSString来实现这个目的?它对于本地化目的很有用.

Jim*_*eia 121

NSString和CFString支持可重新定位/位置参数.

NSString *string = [NSString stringWithFormat: @"Second arg: %2$@, First arg %1$@", @"<1111>", @"<22222>"];
NSLog(@"String = %@", string);
Run Code Online (Sandbox Code Playgroud)

另请参阅Apple的文档:String Resources

  • 只是为了重申我的发现,那么:`stringWithFormat:`只要在格式字符串中指定了所有参数,就支持位置参数. (7认同)
  • 我已经通过一些澄清更新了这个问题.看来Cocoa不尊重格式中省略的参数,这是我收到的访问冲突的副作用. (4认同)
  • 由于C语言中的varargs工作方式,因此无法尊重省略的参数.没有标准方法可以知道参数的数量或它们的大小.字符串解析通过从格式说明符推断信息来处理此问题,这要求说明符实际存在. (2认同)