在Objective-C中,我经常将公共init代码移动到自己的方法中,然后从类的各个指定初始化程序中调用该方法。像这样:
- (void)commonInit {
_gradientLayer = [CAGradientLayer layer];
_gradientLayer.frame = self.bounds;
/* ... */
}
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
[self commonInit];
return self;
}
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
[self commonInit];
return self;
}
在Swift中,这种模式不起作用,因为你基本上必须使用"两阶段init"。首先,您必须为自己的子类分配变量,然后调用super.init
,然后才允许您访问self。 e.g:
init(coder aDecoder: NSCoder!) {
// initial assignment must be done first
gradientLayer = CAGradientLayer()
// no calls to self allowed
super.init(coder: aDecoder)
// calls to self allowed
gradientLayer.frame = self.bounds
/* ... */
}
我可以轻松地移动"第二阶段",设置,在super.init
之后发生到它自己的方法。但是,我无法移动"第一阶段",初始赋值给它自己的方法,因为调用该方法涉及对self的调用,在调用super.init
之前不允许这样做。< / p>
我是否错过了将初始分配移动到自己的方法的方法?我真的不想复制各种init方法中的所有赋值。