![](/img/trans.png)
[英]Can I wrap NSLog in a block that takes a variable number of arguments?
[英]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.