如果在swift的extension中override方法,你就
事情的起因是这样的:
如果想配置当前vc出现时状态栏的样式我们可以这样做:
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
有的vc的状态栏是白色,有的是黑色,总这样override一个方法也是挺碍眼的,那能不能把这个代码移进protocol的extension中呢?
这样的话用起来就像这样:
class XxxViewController:UIViewController,LightStatusBarStyle {
}
想想实现起来很简单嘛:
protocol LightStatusBarStyle:class {
func preferredStatusBarStyle() -> UIStatusBarStyle
}
extension LightStatusBarStyle where Self:UIViewController {
func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
}
但是运行起来的时候,你会发现这个方法没有执行。
于是你再观察了一下,忽然发觉可能是少了<code>override</code>。
我就直接把结果贴出来吧:
你会得到一个error。
extension之前还好好的,怎么override就不行了呢?
真相到底是什么?
是Xcode的抽风,是Swift的忽然自我,还是Mac太久没有重启?
欢迎进入本期的:
真相就是:
在extension中可以添加新函数,但是不能override一个已有的函数
官方是这么说的:
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()
}
}
欢迎关注我的微博:@没故事的卓同学
相关链接:
http://stackoverflow.com/questions/38213286/overriding-methods-in-swift-extensions
http://stackoverflow.com/questions/37492897/swift-dispatch-to-overridden-methods-in-subclass-extensions