事情的原由是這樣的: 若是想配置當前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.
總而言之就是:
不過咱們能夠再回憶一下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的方法仍是沒有幫助 ┑( ̄Д  ̄)┍
歡迎關注個人微博:@沒故事的卓同窗
相關連接: