Swift无法覆盖子类中的变量

时间:2017-06-30 14:27:23

标签: swift inheritance sprite-kit

我正在使用Swift中的macOS项目,并且在我已经完成的几个类中重写变量时遇到了很多麻烦。在Cannot override with a stored property 'texture'中,Xcode在行上显示错误override var texture: SKTexture? ;

     public class classOne: SKSpriteNode {

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

这是我正在使用的一些代码。

    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}}实际定义一个特定的纹理,但是现在我甚至无法完成这项工作..提前感谢,我很感激任何解决这个问题的帮助!

4 个答案:

答案 0 :(得分:3)

修改

@ Knight0fDragon是对的,更好的方法是使用super.texture

class classTwo: classOne {
    override var texture:SKTexture? {
        get {
            return super.texture
        }
        set {
            super.texture = newValue
        }
    }            
}

要覆盖属性,您需要初始化它。换句话说,给它一个初始值。如果你不想要,这是一个解决方法:

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 :(得分:0)

试试这个

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

    }
}

显然返回了一些更有用的东西。

答案 2 :(得分: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)
    }
}

然后使用它,你只需要做classTwo()

(注意,这还没有经过测试,所以我可能有拼写错误,但一般概念在这里)

答案 3 :(得分:0)

在您的子类中,您需要这样做。

override var texture:SKTexture? {
    get { 
        return super.texture
    }
    set {
        super.texture = newValue
    }
}