若是在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…

相關文章
相關標籤/搜索