Swift子类无法重写变量

3

我正在使用Swift语言在macOS项目中开发,但是在我编写的几个类中,重载变量一直是一个困扰我的问题。在classTwo中,Xcode提示错误:Cannot override with a stored property 'texture',该错误出现在以下行:

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
可能是Swift覆盖实例变量的重复问题。 - Arthur Sahakyan
这可行吗?SpriteKit是苹果公司的框架,因此我认为这种覆盖是不可能的。 - Lior Pollak
我不明白你的意思,UIView也是苹果的类... - Arthur Sahakyan
你为什么需要覆盖纹理呢? - Knight0fDragon
请访问以下链接以获取有关Swift编程语言继承的详细信息:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Inheritance.html 并搜索 super.(包括 .)以便阅读。 - mfaani
4个回答

4

编辑

@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
不建议这样做,因为在SKSpriteNode中可能会有一些东西通过存储变量而不是属性来访问纹理,从而产生不期望的结果。 - Knight0fDragon
使用super.texture。 - Knight0fDragon
谢谢@Lawiet,@Knight0fDragon!我会尝试实现这段代码并告诉你们它的运行情况。 - Jake3231
@Jake3231 你为什么要这样做?这种覆盖是毫无意义的。 - Knight0fDragon

1

试试这个

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

    }
}

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

谢谢!我的计划是使用SKTexture.init(imageNamed: "someImage")来为这个类提供一个特定的纹理。您如何在提供的代码中实现这一点? - Jake3231
你尝试过用你上面的init替换SKTexture吗?它应该可以工作。 - iCyberPaul

1
在您的子类中,您需要这样做。
override var texture:SKTexture? {
    get { 
        return super.texture
    }
    set {
        super.texture = newValue
    }
}

0

从我所看的所有内容来看,我认为重写并不是你想要的方法,你需要创建一个convenience init

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()

(注意,这还没有经过测试,所以可能会有错别字,但是总体概念在这里)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接