假设我们有方法:
-(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. }
Ĵ