我知道方法stringWithFormat
通常按如下方式使用:
[NSString stringWithFormat: @"%@ %@", arg1, arg2];
我的问题是,这个方法的最后一个参数的类型究竟是什么(规范中...
的那个)。
我希望能够执行以下操作:
NSArray *array = [NSArray arrayWithObjects: @"Hi", @"Bob"];
[NSString stringWithFormat: @"%@ %@", array]
正如您所看到的,一个数据结构array
正在保存所有参数。不幸的是,这不起作用。有没有办法做到这一点,以便我不必在stringWithFormat
方法中明确列出我的所有参数?
答案 0 :(得分:5)
[NSString stringWithFormat]
采用什么类型的参数?
无论你使用格式字符串告诉它什么类型。
我的问题是,这个方法的最后一个参数的确切类型
这不是最后一个论点。这是一个称为“可变函数”(或在这种情况下为方法)的概念。 ...
表示该函数可以使用任意数量的参数。这是C的一个功能,您可以使用C标准库头<stdarg.h>
中的类型,宏和函数来使用它。示例:这将创建一个包含给定对象的数组。
- (NSArray *)arrayWithCountAndObjects:(int)count, ...
{
NSMutableArray *arr = [NSMutableArray array];
va_list args;
va_start(args, count);
for (int i = 0; i < count; i++) {
[arr addObject:va_arg(args, id)];
}
va_end(args);
return arr;
}
然而 >在这里做的只是加入数组中的项而不是使用可变参数进行黑客攻击,因为这是不必要的:
NSArray *arr = @[@"Hello", @" ", @"world!"];
NSString *s = [arr componentsJoinedByString:@""];
答案 1 :(得分:0)
你不想使用带格式的字符串,如果数组包含字符串,那么你想使用数组方法componentsJoinedByString:。如果你想在字符串之间留一个空格,只需将@“”作为字符串传递。
答案 2 :(得分:0)
它需要变量参数。如果你想查找函数的类型,它被称为“variadic”。
在这种特定情况下,这些参数由您指定的格式字符串确定。 %@
表示任何cocoa对象(继承自NSObject
)。 %s
表示c字符串(以null结尾的char数组)。 %d
表示int,%f
表示浮点数或双精度数,依此类推。它们中有很多(除了%@
之外的所有内容都是从C的printf
函数中借用的)。您可以在此处找到完整的详细信息:http://www.cplusplus.com/reference/cstdio/printf/和https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/FormatStrings.html#//apple_ref/doc/uid/20000943
至于你的尝试,那不是它的运作方式。您只需将阵列拆分为单独的参数,或使用componentsJoinedByString
,或者如果需要更多控制,则手动循环。但您可以使用单个%@
以自己的格式显示数组,可能类似于[First Value; Second Value]
。