无法在属性初始值设定项中使用实例成员

Bil*_*lly 16 ios swift3

我写了一个习惯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()
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常,但如果我从覆盖绘制函数中抓取这一行,它就不会编译.错误说我不能使用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)
Run Code Online (Sandbox Code Playgroud)

不能在属性初始值设定项中使用实例成员'bounds'; 属性初始化程序在'self'可用之前运行

我不明白为什么我不能在func draw中使用这个界限

Rya*_*los 31

因此,如果我们解码错误消息,您可以弄清楚什么是错误的.它说property initializers run before self is available我们需要调整我们正在做的事情,因为我们的财产依赖于属于自我的界限.让我们尝试一个懒惰的变量.您不能在let中使用bound,因为在创建该属性时它不存在,因为它属于self.所以在init,self还没有完成.但是如果你使用一个懒惰的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)
Run Code Online (Sandbox Code Playgroud)

  • 惰性变量意味着该属性在第一次访问之前为空。重要的是,这意味着“self.bounds”可用,因为只有在“self”初始化之后才能访问该属性。 (2认同)