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:
,用户在尝试调用时将收到编译器警告/错误。但是,您肯定也希望将第一个对象传递给方法(您不能只编写带有可变参数的方法和函数,始终需要一个固定参数)