繁体   English   中英

如何从采用可变数量参数的method1中将可变数量的参数传递给method2?

[英]How can I pass variable number of arguments to method2 from method1 that takes a variable number of arguments?

假设我们有方法:

-(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];
}

可能吗

我所见问题的唯一解决方案是将参数存储在数组中,并使用帮助程序方法,该方法将使用给定数组初始化对象。

不,在C(和Objective-C)中,无法传递可变参数。

惯用的解决方案是让您自己使用va_list的初始化程序,将设为指定的初始化程序,然后从其他所有方法调用它。 在可变参数方法中,这看起来像:

- (instancetype)initWithVarargs:(id)first, ...
{
    va_list args;
    va_start(args, first);
    id obj = [self initWithFirst:first VAList:args];
    va_end(args);
    return obj;
}

这是一个带有va_list参数的指定初始化程序:

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

Ĵ

我将为每个方法创建两个版本; 一个使用可变参数( ... ),另一个使用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_list版本可以简单地将该参数传递给另一个va_list方法,而无需任何工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM