对于我来说,关于来自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.height
,super.init
...)
在初始化super.init
属性之前,您也无法调用_dateLabel
;在我看来,这似乎是一个循环问题。
我觉得将它委托给一个单独的函数并不是解决这个问题的正确方法。
/双关语作为便利初始化程序肯定不方便......:)
答案 0 :(得分:1)
在声明变量时不要初始化变量并删除?来自init。
错误是因为当您在初始化程序中访问dateLabel时,它已经在初始化程序之外创建,因此它被访问/使用而不是初始化然后使用。
Show.objects.annotate(
e_count=Count('episodes')
).filter(
e_count__gt=0,
is_active=True,
).order_by('episodes__start').distinct()