2016-11-20 4 views
2

SKSceneを拡張するMenuクラスがありますが、SKSceneの属性であるviewにはアクセスできません。代わりに、次のエラーが表示されます。 "インスタンスメンバー 'ビュー'はタイプメニューで使用できません。クラスはSKSceneを拡張しますが、その属性にはアクセスできません

これにアクセスするために何か特別なことはありますか?それはすでにそれを呼び出すことができるように思われる。問題は、最後の行に来る

class Menu: SKScene { 
var blueButton: Button! 
var touchNode: SKSpriteNode! 
var newScene: SKScene? 

override func didMove(to view: SKView) { 
    blueButton = self.childNode(withName: "Start") as! Button 

} 
... 
class func transitionToScene(node: String) { 
    var scene = SKScene() 

    switch node { 
     case "NewGame": 
      scene = GameScene() 

     default: 
      debugPrint("transition to scene called on no button") 
    } 
    scene.scaleMode = SKSceneScaleMode.aspectFill 
    //(self.view as! SKView).presentScene(scene) 

    self.view.presentScene(scene) 
} 

:ここ

は、クラスの短縮バージョンです。その上に私は別の試みをコメントしたが、これもうまくいかなかった。

答えて

2

インスタンスメソッドと型メソッドの違いに注意する必要があります。インスタンスメソッドは、特定の型のインスタンスに対して呼び出されます。

class SomeClass { 

    func myInstanceMethod() { 

    } 
} 

タイプメソッドは、タイプ自体で呼び出されるメソッドです。 staticキーワードを使用するか、またはclassキーワードのように定義します(classキーワードを使用すると、サブクラスはそのメソッドのスーパークラスの実装をオーバーライドできます)。

したがって、selfはあなたのケースではMenu型ではなく現在のインスタンスを参照するため、インスタンスメソッドを使用する必要があります(classキーワードを削除するだけです)。

+0

これはおそらく超愚かな質問ですが、 'static func'と' class func'の違いは何ですか? – Confused

+1

@Confusedメソッドがクラスfuncとして宣言されている場合、サブクラスはこのメソッドをオーバーライドできます。 staticとして定義されたメソッドは、サブクラスではオーバーライドできません。 – Whirlwind

関連する問題