2017-03-20 5 views
0

ケース1で線を描きたい場合、別の線でメソッドを使用するとUIBezierPath()でそのメソッドを使用できません。UIBezierPath()でインスタンスメソッドを使用できません

しかし、 "。"を追加すると、この方法を使用できます。直ちにケース2

ケース1

import UIKit 

class ViewController: UIViewController { 
    let path = UIBezierPath() 
    path. 
} 

enter image description here

ケース2

import UIKit 

class ViewController: UIViewController { 
    let path = UIBezierPath().move(to: <#T##CGPoint#>) 
} 

等BezierPath()後

+0

私はこの問題について不明です。 UIBezierPath(ケース1)を初期化して**使用できない**と言っていますか?* .move(to:)*入力がCGPointの場合*どうして?できます。どうか明らかにしてください。ありがとう! – dfd

+0

"。"を入力した後で、xcodeがUIBezierPath()のメソッドを推測したい場合は、 "パス"の後、あなたが望むものを得ることができません。あなたが追加した画像を見ることができます – user7341005

答えて

3

はあなたのコードの最初の2行です:

class ViewController: UIViewController { 
    let path = UIBezierPath() 

は(classで始まる)最初の行はViewControllerという名前のクラスの定義を開始します。 2番目の行(letで始まる)はpathという名前のインスタンスプロパティを定義し、プログラムがViewControllerのインスタンスを作成するたびに、式UIBezierPath()を評価することによってpath変数を初期化する必要があります。

path.move(to: .zero) 

問題は、あなたがクラス定義で直接その行を記述しようとしているということです。

次に、あなたがこのような何かを書くことをしようとしています。できません。クラス定義に直接入れることができるのは、プロパティとメソッドの定義のみです。実行されるステートメントを置くことはできません。

あなたには2つの選択肢があります。 1つは後のメソッドでプロパティを初期化することです。たとえば、viewDidLoadです。 Julian J. Tejeraの答えはこれをカバーしています。 selfは完全にそれたときに初期化されていないので、あなたがそのクロージャ内の任意ViewControllerインスタンスのプロパティやメソッドを参照することができません

class ViewController: UIViewController { 

    let path: UIBezierPath = { 
     let path = UIBezierPath() 
     path.move(to: .zero) 
     path.addLine(to: CGPoint(x: 10, y: 0)) 
     return path 
    }() 

} 

注:

それを行うための別の方法は、閉鎖を実行することにより、プロパティを初期化することです走る

+0

経験や文書によって2つの選択肢があることをどう知っていますか? – user7341005

+1

言語のドキュメントを読んでください。 –

3

これは、クラスの宣言の内部ではなく、関数内でメソッドを呼び出す必要があるためです。次のことを試してみてください。ここで

import UIKit 

class ViewController: UIViewController { 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     let path = UIBezierPath() 
     // Invoke method here 
     path. 
    } 
} 
関連する問題