我有一个类似于下面的继承结构。我正在采用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())
答案 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框架中的扩展程序,但它现在似乎运行良好。