我写了一个自定义UIView
,我发现了一个奇怪的问题。我认为这与一个非常基本的概念有关,但我只是不理解它,感叹......
class ArrowView: UIView {
override func draw(_ rect: CGRect) {
let arrowPath = UIBezierPath.bezierPathWithArrowFromPoint(startPoint: CGPoint(x:bounds.size.width/2,y:bounds.size.height/3), endPoint: CGPoint(x:bounds.size.width/2, y:bounds.size.height/3*2), tailWidth: 8, headWidth: 24, headLength: 18)
let fillColor = UIColor(red: 0.00, green: 0.59, blue: 1.0, alpha: 1.0)
fillColor.setFill()
arrowPath.fill()
}
}
这段代码工作正常,但如果我从覆盖绘制函数中抓取这一行,它就不会编译。错误说我不能使用bounds属性。
let arrowPath = UIBezierPath.bezierPathWithArrowFromPoint(startPoint: CGPoint(x:bounds.size.width/2,y:bounds.size.height/3), endPoint: CGPoint(x:bounds.size.width/2, y:bounds.size.height/3*2), tailWidth: 8, headWidth: 24, headLength: 18)
不能使用实例成员' bounds'在属性初始化器内;属性初始化程序在“自我”之前运行是可用的
我不明白为什么我不能在func draw中使用这个界限
答案 0 :(得分:26)
因此,如果我们解码错误消息,您可以弄清楚什么是错误的。它说property initializers run before self is available
所以我们需要调整我们正在做的事情,因为我们的财产依赖于属于自我的界限。让我们尝试一个懒惰的变量。你不能在let中使用边界,因为它在创建属性时不存在,因为它属于self。所以在init自己还没有完成。但是如果你使用一个懒惰的var,那么self和它的属性边界将在你需要的时候准备就绪。
lazy var arrowPath = UIBezierPath.bezierPathWithArrowFromPoint(startPoint: CGPoint(x: self.bounds.size.width/2,y: self.bounds.size.height/3), endPoint: CGPoint(x: self.bounds.size.width/2, y: self.bounds.size.height/3*2), tailWidth: 8, headWidth: 24, headLength: 18)