2017-07-31 18 views
4

私はカスタム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() 
    } 
} 

.....私は、これは非常に基本的な概念に関連していると思いますが、私はそれを理解していない、ため息しますコンパイルしないでください。エラーは私が境界プロパティを使用することができないと言います。

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) 

Cannot use instance member 'bounds' within property initializer; property initializers run before 'self' is available

私は、これは我々がエラーメッセージをデコードする場合は、いただきました!間違って把握することができますので、

+0

の可能性のある重複した[エラー:プロパティの初期化子内のインスタンスのメンバを使用することはできません - スウィフト3](https://stackoverflow.com/questions/40710909/error-cannot-use-instance-member-within-property- initializer-swift-3) – Filburt

+0

この問題は、計算されたプロパティ[Example of Computed Property](https://stackoverflow.com/a/39986404/6689101)を使用して修正できます。 – zombie

答えて

7

を描くFUNCの外に境界を使用できない理由を理解していないドン。それはproperty initializers run before self is availableと言われています。私たちの特性は自己に属する境界に依存するので、私たちがやっていることを調整する必要があります。怠惰な変数を試してみましょう。レット内の境界は自己に属しているため、そのプロパティが作成されたときに存在しないため、境界内を使用することはできません。ですから、initではselfはまだ完全ではありません。しかし、怠惰なvarを使用する場合、自己とそのプロパティの境界は、必要なときに準備が整います。

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) 
関連する問題