d12*_*ted 10 arguments objective-c
假设我们有方法:
-(instancetype) initWithElements:(id)firstElement, ... NS_REQUIRES_NIL_TERMINATION;
+(instancetype) objWithElements:(id)firstElement, ... NS_REQUIRES_NIL_TERMINATION;
Run Code Online (Sandbox Code Playgroud)
我明白,如何使用可变数量的参数-initWithElements:,但我不明白如何将变量传递-objWithElements:给-initWithElements:.
我的意思是,我想写一些类似的东西:
+(instancetype) objWithElements:(id)firstElement, ... NS_REQUIRES_NIL_TERMINATION {
return [[[self] initWithElements:ELEMENTS] autorelease];
}
Run Code Online (Sandbox Code Playgroud)
它甚至可能吗?
我看到的问题的唯一解决方案是在数组中存储参数并使用将使用给定数组的init对象的辅助方法.
小智 8
不,在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;
}
Run Code Online (Sandbox Code Playgroud)
这是一个带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.
}
Run Code Online (Sandbox Code Playgroud)
Ĵ
我会为每个方法创建两个版本; 一个采用变量arguments(...)和另一个(实际实现的地方)使用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;
Run Code Online (Sandbox Code Playgroud)
这将允许va_list版本简单地将该参数传递给另一个va_list方法而根本没有工作.
var args version(...)将使用va_start()et等来创建传递给方法版本的va_list 对象va_list.