[NSString stringWithFormat]采用什么类型的参数?

时间:2013-03-28 19:49:25

标签: iphone ios objective-c

我知道方法stringWithFormat通常按如下方式使用:

[NSString stringWithFormat: @"%@ %@", arg1, arg2];

我的问题是,这个方法的最后一个参数的类型究竟是什么(规范中...的那个)。

我希望能够执行以下操作:

NSArray *array = [NSArray arrayWithObjects: @"Hi", @"Bob"];
[NSString stringWithFormat: @"%@ %@", array]

正如您所看到的,一个数据结构array正在保存所有参数。不幸的是,这不起作用。有没有办法做到这一点,以便我不必在stringWithFormat方法中明确列出我的所有参数?

3 个答案:

答案 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]