当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《有没有办法在NSStringstringWithFormat中指定参数位置/索引?》经验,为你挑选了1个好方法。

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来实现这个目的?它对于本地化目的很有用.



1> Jim Correia..:

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

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

另请参阅Apple的文档:String Resources


只是为了重申我的发现,那么:`stringWithFormat:`只要在格式字符串中指定了所有参数,就支持位置参数.
我已经通过一些澄清更新了这个问题.看来Cocoa不尊重格式中省略的参数,这是我收到的访问冲突的副作用.
由于C语言中的varargs工作方式,因此无法尊重省略的参数.没有标准方法可以知道参数的数量或它们的大小.字符串解析通过从格式说明符推断信息来处理此问题,这要求说明符实际存在.
推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有