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

Nos*_*tap 1 iphone objective-c ios

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

[NSString stringWithFormat: @"%@ %@", arg1, arg2];
Run Code Online (Sandbox Code Playgroud)

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

我希望能够做类似以下的事情:

NSArray *array = [NSArray arrayWithObjects: @"Hi", @"Bob"];
[NSString stringWithFormat: @"%@ %@", array]
Run Code Online (Sandbox Code Playgroud)

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

小智 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;
}
Run Code Online (Sandbox Code Playgroud)

但是,应该在这里做的只是加入数组中的项而不是使用可变参数进行黑客攻击,因为这是不必要的:

NSArray *arr = @[@"Hello", @" ", @"world!"];
NSString *s = [arr componentsJoinedByString:@""];
Run Code Online (Sandbox Code Playgroud)