Swift: declaration 'description' cannot override more than one superclass declaration

前端 未结 4 1688
深忆病人
深忆病人 2021-02-08 10:07

I have a structure of inheritance similar to the one below. I\'m adopting the Printable protocol and diligently override description property. I have encountered a bizarre error

相关标签:
4条回答
  • 2021-02-08 10:29

    I had the same problem with SKTiled when overriding SKTiledScene. In my situation I wanted to override a mouse event for OS X.

    The error was as follows:

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

    The problem here is that the mouse events are declared in a class extension:

    #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
    

    I could solve my issue to override the method in my own SKTiledScene subclass by re-implementing the extension:

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

    I do wonder if I can be sure my extension is always loaded instead of the one from the SKTiled framework, but it seems to work well for now.

    0 讨论(0)
  • 2021-02-08 10:38

    What is the Printable Protocol? ;-)

    You could use a Getter of a property as

    var description: String {
        get {
            return "This is a test";
        }
    }
    
    0 讨论(0)
  • 2021-02-08 10:38

    I don't have access to my Mac now, but I would try removing the override in First. override is needed when subclassing but not when implementing a protocol.

    0 讨论(0)
  • 2021-02-08 10:40

    Same problem for me, solved by doing:

    func customDescription() -> String {
        return ""
    }
    
    override var description: String {
        return customDescription()
    }
    

    so you can override function as many times as you want to

    0 讨论(0)
提交回复
热议问题