Swift:声明'description'不能覆盖多个超类声明

时间:2014-06-27 19:25:57

标签: clang swift

我有一个类似于下面的继承结构。我正在采用Printable协议并努力覆盖描述属性。我遇到了一个奇怪的错误,谷歌目前似乎不知道这个错误,提示是第三类,并引用了Second和First类。

为了加重伤害,下面的代码实际编译得很好,但我的完整代码没有。在Second和Third上注释属性可以解决问题和代码编译,测试通过等。

Swift继承章节提供了对此的指示。

有谁知道这意味着什么以及在哪种情况下触发它?

  

/Users/ivanhoe/Dropbox/swift/convergence/Processable.swift:124:18:   错误:声明'description'不能覆盖多个   超类声明       override var description:String {                    ^ /Users/ivanhoe/Dropbox/swift/convergence/Processable.swift:85:18:   注意:重写声明在这里       override var description:String {                    ^ /Users/ivanhoe/Dropbox/swift/convergence/Processable.swift:28:18:   注意:重写声明在这里       override var description:String {

import Foundation

class First : NSObject, Printable {

    override var description : String {
        return "first"
    }
}

class Second : First {

    override var description : String {
        return "second"
    }

}

class Third : Second {

    override var description : String {
        return "third"
    }

}

println(Third())

4 个答案:

答案 0 :(得分:12)

对我来说同样的问题,通过这样解决:

func customDescription() -> String {
    return ""
}

override var description: String {
    return customDescription()
}

因此您可以根据需要多次覆盖功能

答案 1 :(得分:2)

什么是可打印协议? ; - )

您可以使用属性的Getter作为

var description: String {
    get {
        return "This is a test";
    }
}

答案 2 :(得分:0)

我现在无法访问我的Mac,但我会尝试删除override中的First。在进行子类化时需要override,而在实现protocol时则不需要{。}}。

答案 3 :(得分:0)

覆盖SKTiled时,SKTiledScene遇到了同样的问题。在我的情况下,我想覆盖OS X的鼠标事件。

错误如下:

Declaration 'mouseUp(with:)' cannot override more than one superclass declaration

这里的问题是鼠标事件是在类扩展中声明的:

#if os(macOS)
extension SKTiledScene {

    override open func mouseDown(with event: NSEvent) {}

    override open func mouseMoved(with event: NSEvent) {
        guard let cameraNode = cameraNode else { return }
        cameraNode.mouseMoved(with: event)
    }
    override open func mouseUp(with event: NSEvent) {}
    override open func mouseEntered(with event: NSEvent) {}
    override open func mouseExited(with event: NSEvent) {}

    override open func scrollWheel(with event: NSEvent) {
        guard let cameraNode = cameraNode else { return }
        cameraNode.scrollWheel(with: event)
    }
}
#endif

我可以通过重新实现扩展来解决我的问题,以覆盖我自己的SKTiledScene子类中的方法:

extension SKTiledScene {
    open override func mouseUp(with event: NSEvent) {
        try! SceneManager.shared.transitionToScene(MainMenuScene.self, withAnimation: .fade)
    }
}

我想知道我是否可以确定我的扩展程序总是被加载而不是SKTiled框架中的扩展程序,但它现在似乎运行良好。