Override function error in swift

*爱你&永不变心* 提交于 2020-01-01 11:57:14

问题


I got a struct :

struct ErrorResultType: ErrorType {
    var description: String
    var code: Int
}

and a protocol:

protocol XProtocol {
    func dealError(error: ErrorResultType)
}

Now I want to make an extention of UIViewController:

extension UIViewController: XProtocol {

    func dealError(error: ErrorResultType) {
        // do something 
    }
}

So I can subclass from this and override the function like:

class ABCViewController: UIViewController {

--->override func dealError(error: ErrorResultType) {
        super.dealError(error)
        // do something custom
    }
} 

But it goes wrong with: Declarations from extensions cannot be overridden yet

It doesn't make any sense to me. When I replace all ErrorResultType with AnyObject, the error won't appear any more.

Anything I missed?


回答1:


For now the method in the extension must be marked with @objc to allow overriding it in subclasses.

extension UIViewController: XProtocol {

    @objc
    func dealError(error: ErrorResultType) {
        // do something
    }
}

But that requires all types in the method signature to be Objective-C compatible which your ErrorResultType is not. Making your ErrorResultType a class instead of a struct should work though.




回答2:


If i am not making mistake this is connected with Swift official extension mechanism for adding methods to classes.

Conclusion :

At the moment, it's not possible to override entities declared in extension by subclassing, like so:

class Base { }

extension Base {
    var foo: String { return "foo" }
}

class Sub: Base {
    override var foo: String { return "FOO" } // This is an error
}

Please check this resource for more information : https://github.com/ksm/SwiftInFlux/blob/master/README.md#overriding-declarations-from-extensions



来源:https://stackoverflow.com/questions/34061246/override-function-error-in-swift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!