属性初始值设定项内不能使用实例成员

我写了一个自定义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() } } 

这段代码工作正常,但如果我抓住了这一行的重写绘制function,它不会编译。 错误说我不能使用边界属性。

 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) 

无法在属性初始值设定项中使用实例成员“范围”; 属性初始值设定项在“self”可用之前运行

我不明白为什么我不能使用这个function画出来的边界

所以,如果我们解码错误消息,你可以找出什么是错的。 它说property initializers run before self is available所以我们需要调整我们正在做的事情,因为我们的属性取决于属于自己的边界。 让我们尝试一个懒惰的variables。 你不能在let中使用边界,因为当属性被创build时它不存在,因为它属于self。 所以在初始阶段,我还没有完成。 但是如果你使用了一个懒惰的variables,那么当你需要的时候自己和它的属性边界就会准备好。

 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)