我有一个结构:
struct ErrorResultType: ErrorType {
var description: String
var code: Int
}
和协议:
protocol XProtocol {
func dealError(error: ErrorResultType)
}
现在我要扩展UIViewController:
extension UIViewController: XProtocol {
func dealError(error: ErrorResultType) {
// do something
}
}
所以我可以从中继承并覆盖函数,如:
class ABCViewController: UIViewController {
--->override func dealError(error: ErrorResultType) {
super.dealError(error)
// do something custom
}
}
但它出错:Declarations from extensions cannot be overridden yet
这对我没有任何意义。当我用ErrorResultType
替换所有AnyObject
时,错误将不再出现。
我错过了什么?
答案 0 :(得分:4)
现在,扩展中的方法必须用@objc
标记,以允许在子类中覆盖它。
extension UIViewController: XProtocol {
@objc
func dealError(error: ErrorResultType) {
// do something
}
}
但是,这要求方法签名中的所有类型都与Objective-C兼容,而ErrorResultType
则不然。
让ErrorResultType
成为一个类而不是一个结构应该可行。
答案 1 :(得分:1)
如果我没有犯错误,这与Swift官方扩展机制相关联,用于向类添加方法。
结论:
目前,无法覆盖声明的实体 通过子类化扩展,如下所示:
class Base { }
extension Base {
var foo: String { return "foo" }
}
class Sub: Base {
override var foo: String { return "FOO" } // This is an error
}
请查看此资源以获取更多信息:https://github.com/ksm/SwiftInFlux/blob/master/README.md#overriding-declarations-from-extensions