如何在不同的指定init方法之间共享公共init代码?

时间:2014-06-05 03:32:24

标签: swift

在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
    /* ... */
}

我可以轻松地移动&#34;第二阶段&#34;,设置,在super.init之后发生到它自己的方法。但是,我无法移动&#34;第一阶段&#34;,初始赋值给它自己的方法,因为调用该方法涉及对self的调用,在调用super.init之前不允许这样做。< / p>

我是否错过了将初始分配移动到自己的方法的方法?我真的不想复制各种init方法中的所有赋值。

0 个答案:

没有答案