Swift init委托

时间:2015-08-03 22:57:45

标签: ios swift

对于我来说,关于来自Java / C#/ C ++背景的快速语言最令人困惑的事情之一就是构造函数委派。

我有read about it,但我遇到了现实生活中的问题。

我正在制作一个自定义" DateView"显示日期。

import UIKit

@IBDesignable class DateView: UIView {

    private let _dateLabel = UILabel()

    func initLabel() {
        _dateLabel.frame = CGRectMake(0, 0, self.bounds.width, self.bounds.height)
        addSubview(_dateLabel)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        initLabel()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        initLabel()
    }
}

我遇到的问题是如何正确地初始化我的课程。实际上,override init是支持IBDesignable类所必需的。 UIView的子类需要required init。 有没有一种正确的方法来委托这个公共代码来初始化_dateLabel,同时利用视图的边界来初始化标签?

此外,在致电self

之前,您无法访问.bounds.width.bounds.heightsuper.init ...)

can't call init before initializing label

在初始化super.init属性之前,您也无法调用_dateLabel;在我看来,这似乎是一个循环问题。

can't call self before init

我觉得将它委托给一个单独的函数并不是解决这个问题的正确方法。

/双关语作为便利初始化程序肯定不方便......:)

1 个答案:

答案 0 :(得分:1)

在声明变量时不要初始化变量并删除?来自init。

错误是因为当您在初始化程序中访问dateLabel时,它已经在初始化程序之外创建,因此它被访问/使用而不是初始化然后使用。

Show.objects.annotate(
    e_count=Count('episodes')
).filter(
    e_count__gt=0,
    is_active=True,
).order_by('episodes__start').distinct()