Objective c 我如何从接受可变数量参数的method1将可变数量的参数传递给method2?

Objective c 我如何从接受可变数量参数的method1将可变数量的参数传递给method2?,objective-c,arguments,Objective C,Arguments,假设我们有以下方法: -(instancetype) initWithElements:(id)firstElement, ... NS_REQUIRES_NIL_TERMINATION; +(instancetype) objWithElements:(id)firstElement, ... NS_REQUIRES_NIL_TERMINATION; 我了解如何在-initWithElements:中使用可变数量的参数,但不了解如何将变量从-objWithElements:传递到-initW

假设我们有以下方法:

-(instancetype) initWithElements:(id)firstElement, ... NS_REQUIRES_NIL_TERMINATION;
+(instancetype) objWithElements:(id)firstElement, ... NS_REQUIRES_NIL_TERMINATION;
我了解如何在
-initWithElements:
中使用可变数量的参数,但不了解如何将变量从
-objWithElements:
传递到
-initWithElements:

我的意思是,我想写一些像:

+(instancetype) objWithElements:(id)firstElement, ... NS_REQUIRES_NIL_TERMINATION {
    return [[[self] initWithElements:ELEMENTS] autorelease];
}
有可能吗

我看到的问题的唯一解决方案是将参数存储在数组中,并使用helper方法来初始化给定数组的对象

不,在C(和Objective-C)中,不可能传递变量参数

惯用的解决方案是给自己找一个初始值设定项,该初始值设定项采用
va_列表
,将该初始值设定项设为指定的初始值设定项,然后从其他方法调用它。在变量方法中,这看起来像:

- (instancetype)initWithVarargs:(id)first, ...
{
    va_list args;
    va_start(args, first);
    id obj = [self initWithFirst:first VAList:args];
    va_end(args);
    return obj;
}
这里有一个指定的初始值设定项,它接受一个
va_列表
参数:

- (id)initWithFirst:(id)first VAList:(va_list)args
{
    id obj;
    while ((obj = va_arg(args, id)) != nil) {
        // do actual stuff
    }
    // the return self, etc.
}

j

我会为每个方法创建两个版本;一个使用变量参数(
),另一个使用
va_list

-(instancetype) initWithElements:(id)firstElement, ... NS_REQUIRES_NIL_TERMINATION;
-(instancetype) initWithElementsImpl:(va_list)va;
+(instancetype) objWithElements:(id)firstElement, ... NS_REQUIRES_NIL_TERMINATION;
+(instancetype) objWithElementsImpl:(va_list)va;
这将允许
va_列表
版本只需将该参数传递到另一个
va_列表
方法,而无需任何工作


var args版本(
)将使用
va_start()
等创建
va_list
对象,以传递给方法的
va_list
版本。

。但是使用
-(id)initWithFirst:(id)first VAList:(va_list)args而不是
-(instancetype)initwithelementsimple:(va_list)args
真的有必要吗?我的意思是,如果用户输入类似
[obj initWithVarargs:nil]
?@RottenBrain我看不出您的问题。用户只调用存在的方法。如果未声明
initWithVarargs:
,用户在尝试调用时将收到编译器警告/错误。但是,您肯定也希望将第一个对象传递给方法(您不能只编写带有可变参数的方法和函数,始终需要一个固定参数)