如何跳过数据传递到[NSString stringWithFormat:]

时间:2014-11-05 09:41:26

标签: ios objective-c xcode nsstring format

请考虑以下代码:

int count = 1;
NSString* format = count == 1 ? @"One %2$@" : @"%1$d %2$@s";
NSString* result = [NSString stringWithFormat: format, count, @"Bread"];

count不是1,结果有效:

2 Breads
4 Breads

count1,则会导致EXC_BAD_ACCESS

NSLog(@"%@", [NSString stringWithFormat:@"One %2$@", 1, @"Bread"]);

Xcode编译器抱怨上面的代码:

Data argument not used by format string

我知道这个错误的原因。 但是,我的方法(动态格式可能会跳过一些数据)也很有用。如果它有用的话。

有没有解决方法呢?

2 个答案:

答案 0 :(得分:2)

[NSString stringWithFormat:]不支持位置参数。 这看起来像[NSString stringWithFormat:]中的错误。

一种解决方法(hack)是使用普通printf函数并将结果转换为 NSString

char *format = count == 1 ? "One %2$s" : "%1$d %2$ss";
char *tmp;
asprintf(&tmp, format, count, "Bread");
NSString *result = [NSString stringWithUTF8String:tmp];
free(tmp);

但正确的解决方案是创建一个" Localizable.strings"文件 语言复数规则,如中所述 "Handling Noun Plurals and Units of Measurement" 在国际化和本地化指南中。

另见"String Localization" 用于文档和示例。

答案 1 :(得分:0)

替换: -

NSLog(@"%@", [NSString stringWithFormat:@"One %2$@", 1, @"Bread"]);

以下修改: -

NSLog(@"%@", [NSString stringWithFormat:@"%@,%d,%@",@"One %2$@", 1, @"Bread"]);