若是在swift的extension中override方法,你就会发现这有点难办

事情的原由是这样的: 若是想配置当前vc出现时状态栏的样式咱们能够这样作:swift

override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .LightContent
    }复制代码

有的vc的状态栏是白色,有的是黑色,总这样override一个方法也是挺碍眼的,那能不能把这个代码移进protocol的extension中呢? 这样的话用起来就像这样:ide

class XxxViewController:UIViewController,LightStatusBarStyle {

    }复制代码

想一想实现起来很简单嘛:函数

protocol LightStatusBarStyle:class {
   func preferredStatusBarStyle() -> UIStatusBarStyle
}

extension LightStatusBarStyle where Self:UIViewController {
    func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .LightContent
    }
}复制代码

可是运行起来的时候,你会发现这个方法没有执行。 因而你再观察了一下,突然发觉多是少了override。 我就直接把结果贴出来吧:ui

你会获得一个error。spa

extension以前还好好的,怎么override就不行了呢? 真相究竟是什么? 是Xcode的抽风,是Swift的突然自我,仍是Mac过久没有重启?code

欢迎进入本期的:cdn

真相就是:blog

在extension中能够添加新函数,可是不能override一个已有的函数get

官方是这么说的:string

Extensions can add new functionality to a type, but they cannot override existing functionality.

总而言之就是:

one more thing

不过咱们能够再回忆一下OC的runtime。 能够对方法增长dynamic修饰符声明为OC的方法,这样就能够曲线的在extension中使用override了:

class A : NSObject {
    dynamic func doThing() {
        print("dothing super class")
    }
}
class B: A {
}
extension B {
    override func doThing() {
        print("dothing sub class")
        super.doThing()
    }
}复制代码

不过这对于我在开始想要直接在extension中直接override UIViewcontroller的方法仍是没有帮助 ┑( ̄Д  ̄)┍

欢迎关注个人微博:@没故事的卓同窗

相关连接:

stackoverflow.com/questions/3…

stackoverflow.com/questions/3…

相关文章
相关标签/搜索