2017-06-30 11 views
2

私はSwiftのmacOSプロジェクトに取り組んでいます。私が作ったいくつかのクラスで変数を上書きすることに多くの問題がありました。 In classTwo XcodeがエラーCannot override with a stored property 'texture'を表示しています。Swiftはサブクラスの変数を無効にすることができません

override var texture: SKTexture? 

これは私が使用しているコードの一部です。

 public class classOne: SKSpriteNode { 

     required public init?(coder aDecoder: NSCoder) { 
      fatalError("init(coder:) has not been implemented") 
     } 
// Other functions 
    } 

2番目のクラス。

class classTwo: classOne { 
     override var texture: SKTexture? // Cannot override with a stored property 'texture' 

     required init?(coder aDecoder: NSCoder) { 
      fatalError("init(coder:) has not been implemented") 
     } 
// Some other functions 
    } 

私は実際にclassTwoのための具体的なテクスチャを定義する予定ですが、今の私もこの作品を作ることができなかった...事前のおかげで、私は、この問題を解決する上の任意の助けをいただければと思います!

+1

[スウィフトオーバーライドインスタンス変数](https://stackoverflow.com/questions/26188903/swift-override-instance-variables)の可能性のある重複 –

+0

はそれも可能ですか? SpriteKitはAppleのフレームワークなので、この種のオーバーライドは不可能だと思います。 –

+0

UIViewはAppleのクラスです... –

答えて

3

EDIT

は、より良いアプローチは、あなたがそれを初期化する必要があるプロパティをオーバーライドするためにsuper.texture

​​

を使用することで、正しかったです。言い換えれば、初期値を与える。あなたがしたくない場合は、ここでの回避策は次のとおりです。

class classTwo: classOne {  
    var _texture:SKTexture 
    override public var texture: SKTexture? { 
     get { 
      return _texture 
     } 
     set { 
      _texture = newValue! 
     } 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
    // Some other functions 
} 
+1

これは推奨されていませんが、SKSpriteNodeの何かが、プロパティではなくストアド変数を介してテクスチャにアクセスする可能性がありますので、望ましくない結果が得られます – Knight0fDragon

+0

super.textureを代わりに使用 – Knight0fDragon

+0

@Lawiet、@ Knight0fDragonありがとうございます!私はこのコードを実装しようとし、どのように行くのかを教えてくれるでしょう。 – Jake3231

0

は明らかにもう少し何か有用なものを返すこの

override var texture: SKTexture? { 
    get { 
     return SKTexture() 
    } 
    set { 

    } 
} 

を試してみてください。 Knight0fDragon @

+0

ありがとう!私の計画は 'SKTexture.init(imageNamed:" someImage ")'を使ってクラスに特定のテクスチャを与えることです。あなたが提供したコードを使って、どうすればいいですか? – Jake3231

+0

SKTextureを上記のinitに置き換えてみましたか?それは動作するはずです。 – iCyberPaul

0

すべての私の読書から、私はオーバーライドしないと思うしたいのアプローチである、あなたは次に

class classTwo: classOne { 
    convenience init() 
    { 
     let texture = SKTexture(imageNamed:"myImage") 
     self.init(texture,.white,texure.size) 
    }  

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder:aDecoder) 
    } 
} 

のinit利便性を作成したいですあなたがこれを行う必要があり、あなたのサブクラスで

0

それを使用して、あなただけの

()classTwo行う必要があります(ただし注意が、これはテストされていませんが、私はタイプミスを有していてもよく、一般的な概念はここにあります) 。

override var texture:SKTexture? { 
    get { 
     return super.texture 
    } 
    set { 
     super.texture = newValue 
    } 
} 
関連する問題