在swift中覆盖函数错误

时间:2015-12-03 08:38:46

标签: ios swift protocols

我有一个结构:

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时,错误将不再出现。

我错过了什么?

2 个答案:

答案 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