質問: SKShapeNode(circleOfRadius:self.frame.width/100.0) func getWidthHeight(){ width=self.frame.width height=self.frame.width }... ``` ■回答いただきたいこと 1."Value of type '(NSObject) -> () -> GameScene' has no member 'frame'"と怒られた理由 2.上記コードのfunc内ではなぜ怒られないのか 3.上記コードのfunc内のself.frame.widthのselfはGameSceneのことではないのか 以上3つについて回答をお願いしたいです。 よろしくお願いいたします。
回答: ご質問文のタイトルには「【初歩的な質問です】」のように、ご質問内容を表現するのに不要な情報は含めないようにしてください。 ***1."Value of type '(NSObject) -> () -> GameScene' has no member 'frame'"と怒られた理由*** インスタンスプロパティの初期化式の中では`self`がインスタンスを表さないからです。 (現在のSwiftの実装では`NSObject`の`self`メソッドとして解釈されるようですが、実用的な意味はないので、「Swiftではインスタンスプロパティの初期化式の中で(普通の意味の)`self`は使えない」と覚えておいてください。) ***2.上記コードのfunc内ではなぜ怒られないのか*** インスタンスメソッドの中では`self`がインスタンスを表すからです。 ***3.上記コードのfunc内のself.frame.widthのselfはGameSceneのことではないのか*** こう言った微妙な状況では「GameSceneのこと」と言う表現ではYesともNoとも答えられませんが、`GameScene`のインスタンスメソッドの中では`self`は`GameScene`のインスタンスを表します。 「Swiftではインスタンスプロパティの初期化式の中で(普通の意味の)`self`は使えない」と言うのは、Swiftの初期化に関わる厳密な制約によるものです。ご興味がおありならばSwift本のClass Inheritance and Initializationあたりを熟読して見てください。 「回答いただきたいこと」にはありませんが、上記の制約を回避する方法として、`lazy`を使う方法が知られています。 ``` lazy var circle = SKShapeNode(circleOfRadius:self.frame.width/100.0) ``` `lazy`なインスタンスプロパティは最初に参照される直前に初期化され、その初期化式内の`self`は普通にインスタンスを表すものとして解釈されます。初期化のタイミングが関わるような処理でなければ、「やりたかったこと」が実現できるのではないかと思います。