是否可以这样做:
- (void) setList:(id) firstObj,...
{
va_list args;
va_start(args,firstObj);
list = [[NSArray alloc] initWithObjects:args]; // Compile error
va_end(args);
}
是否可以这样做:
- (void) setList:(id) firstObj,...
{
va_list args;
va_start(args,firstObj);
list = [[NSArray alloc] initWithObjects:args]; // Compile error
va_end(args);
}
试试这个:
- (void) setList:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION
{
va_list args;
va_start(args, firstObj);
list = [[NSMutableArray alloc] initWithObjects:firstObj, nil];
id obj;
while ((obj = va_arg(args, id)) != nil) {
[list addObject:obj];
}
va_end(args);
}
NSArray
没有采用 a 的构造函数,va_list
因此您必须自己循环 args 并将它们添加到可变数组中。您还应该为要nil
终止的参数添加一个约束。
- (void) setList:(id) firstObj,... __attribute__((sentinel)) //make sure it is nil terminated
{
//You have to add the first object yourself
NSMutableArray *tmplist = [NSMutableArray arrayWithObject:firstObj];
va_list args;
va_start(args,firstObj);
id arg;
while((arg = va_arg(args, id)) != nil)
[tmplist addObject:arg];
va_end(args);
list = [tmplist copy];
}
非常接近,这样的事情应该可以工作。问题是没有用于此的 API 函数,因此您必须从列表中取出对象并将它们添加到您实例化的数组中。
-(void *)setList:(id)firstObj, ... {
//The array you're holding everything in
arr = [NSMutableArray array];
[arr addObject:firstObject];
//Get the variable list
va_list args;
va_start(args, action1);
//Create the object
id object = va_arg(args, id);
//Keep adding objects until you run out
while(object) {
[arr addObject:object];
object = va_arg(args, id);
}
va_end(args);
}