swift 協(xié)議與函數(shù)派發(fā)的幾點問題

1、

問題先從一個協(xié)議說起

protocol DefaultProtocol: NSObjectProtocol{
    func defaultImpl()
}
extension DefaultProtocol{
    func defaultImpl(){
        print("默認實現(xiàn)")
    }
}

這是一個方法帶有默認實現(xiàn)的協(xié)議何吝,實現(xiàn)它:

//1
class SuperClass: NSObject, DefaultProtocol{}
class SubClass: SuperClass {
    func defaultImpl() {
        print("子類實現(xiàn)")
    }
}

使用:

let object: DefaultProtocol = SubClass()
object.defaultImpl()

輸出是什么呢溉委?

可以簡單分析一下代碼:
object 指定為 DefaultProtocol 類型,其指針指向的是SubClass對象爱榕, 當調(diào)用object.defaultImpl() 時瓣喊,系統(tǒng)首先拿到objectisa指針找到 SubClass 然后找到SubClass對應的虛函數(shù)表,根據(jù)偏移量找到defaultImpl()方法調(diào)用黔酥,輸出 子類實現(xiàn)

大概就是這么個流程對吧

ok
現(xiàn)在來看輸出

納尼藻三?!跪者!不科學棵帽!
這太不唯物主義了!

難道swift實現(xiàn)了什么黑魔法渣玲?

我們把代碼稍微調(diào)整一下:

//2
class SuperClass: NSObject, DefaultProtocol{
    func defaultImpl() {
        print("父類實現(xiàn)")
    }
}
class SubClass: SuperClass {
    override func defaultImpl() {
        print("子類實現(xiàn)")
    }
}

再來看輸出:

ok逗概, 這才是我們想要的結(jié)果。

由1柜蜈、2結(jié)合可以推測出來仗谆,當SuperClass沒有實現(xiàn)協(xié)議方法時,SubClass對協(xié)議方法的實現(xiàn)并不會寫到自己的method_list中, 所以才會調(diào)用方法的默認實現(xiàn)淑履,在 2中SuperClass實現(xiàn)了協(xié)議方法隶垮,SubClass重寫覆蓋了父類在method_list中的方法,才能正常調(diào)用秘噪。

通過google(這里)后發(fā)現(xiàn)這玩意很可能是個bug狸吞,并且嘗試過Javakotlin的相同實現(xiàn)方法都沒有問題。

那就暫且當作一個待修復的 bug 處理吧指煎。

2蹋偏、

那自己寫的協(xié)議與系統(tǒng)提供的協(xié)議會不會有不一樣的表現(xiàn)呢?

拿個我們最熟悉的協(xié)議 UIScrollViewDelegate舉個簡單的??至壤。

class SuperVC: UIViewController, UIScrollViewDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addSubview(scrollView)
    }
    lazy var scrollView: UIScrollView = {
        let o = UIScrollView.init(frame: self.view.bounds)
        o.contentSize = CGSize(width: ScreenW*2, height: ScreenH*2)
        o.backgroundColor = .magenta
        o.delegate = self
        return o }()
}

class SubVC: SuperVC {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        print("滾動\(scrollView.contentOffset)")
    }
}

輸出

父類沒有實現(xiàn)的協(xié)議方法在子類正常調(diào)用M肌!像街!
黎棠?晋渺??脓斩?木西??随静?


如果問題到這里八千,就按照bug解決, 愛誰誰燎猛,以后多注意就完事了

但偏偏我又多做了一個試驗

3恋捆、

如果實現(xiàn)協(xié)議的類帶了泛型呢?

Let's coding happily

class SuperVC<T>: UIViewController, UIScrollViewDelegate {

    var text: T?
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addSubview(scrollView)
    }
    lazy var scrollView: UIScrollView = {
        let o = UIScrollView.init(frame: self.view.bounds)
        o.contentSize = CGSize(width: ScreenW*2, height: ScreenH*2)
        o.backgroundColor = .magenta
        o.delegate = self
        return o }()
}

class SubVC: SuperVC<NSString> {
    override var text: NSString? {get{return "范型~~~"} set{}}
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        print("滾動\(scrollView.contentOffset)")
        print(text!)
    }
}

輸出:

并沒有任何輸出扛门!

同問題1一樣子類跳過父類實現(xiàn)的協(xié)議方法并沒有被調(diào)用
而現(xiàn)在我只是多加了個泛型而已

試驗到這我已經(jīng)詞窮了鸠信, 一萬頭草泥馬纵寝,萬臉懵逼论寨。

問題

1、協(xié)議中的optional方法, 實現(xiàn)的時候是通過何種方式派發(fā)的爽茴?
2葬凳、為什么自己實現(xiàn)的協(xié)議與系統(tǒng)表現(xiàn)的不一樣,系統(tǒng)提供的協(xié)議做了什么室奏?
3火焰、swift在編譯的過程中,對有范型的類除了做了泛型擦除還做了什么胧沫,以至于影響到了函數(shù)的派發(fā)昌简?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绒怨,隨后出現(xiàn)的幾起案子纯赎,更是在濱河造成了極大的恐慌,老刑警劉巖南蹂,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犬金,死亡現(xiàn)場離奇詭異,居然都是意外死亡六剥,警方通過查閱死者的電腦和手機晚顷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疗疟,“玉大人该默,你說我怎么就攤上這事〔咄” “怎么了栓袖?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵顿膨,是天一觀的道長。 經(jīng)常有香客問我叽赊,道長恋沃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任必指,我火速辦了婚禮囊咏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘塔橡。我一直安慰自己梅割,他們只是感情好,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布葛家。 她就那樣靜靜地躺著户辞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪癞谒。 梳的紋絲不亂的頭發(fā)上底燎,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音弹砚,去河邊找鬼双仍。 笑死,一個胖子當著我的面吹牛桌吃,可吹牛的內(nèi)容都是我干的朱沃。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼茅诱,長吁一口氣:“原來是場噩夢啊……” “哼逗物!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瑟俭,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤翎卓,失蹤者是張志新(化名)和其女友劉穎例隆,沒想到半個月后花嘶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蕉斜,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡碟绑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年冯挎,在試婚紗的時候發(fā)現(xiàn)自己被綠了摊灭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片被济。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡拍冠,死狀恐怖畜号,靈堂內(nèi)的尸體忽然破棺而出缴阎,到底是詐尸還是另有隱情,我是刑警寧澤简软,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布蛮拔,位于F島的核電站述暂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏建炫。R本人自食惡果不足惜畦韭,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肛跌。 院中可真熱鬧艺配,春花似錦、人聲如沸衍慎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稳捆。三九已至赠法,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乔夯,已是汗流浹背砖织。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驯嘱,地道東北人镶苞。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓喳坠,卻偏偏與公主長得像鞠评,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子壕鹉,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,089評論 1 32
  • 前言 說是前言剃幌,其實也是本文誕生的目的。隨著公司業(yè)務的不斷增加晾浴,功能的快速迭代负乡,app的業(yè)務線越來越多,代碼體積變...
    Yealink閱讀 5,276評論 0 13
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法脊凰,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,213評論 0 2
  • 面向?qū)ο笾饕槍γ嫦蜻^程抖棘。 面向過程的基本單元是函數(shù)。 什么是對象:EVERYTHING IS OBJECT(萬物...
    sinpi閱讀 1,046評論 0 4
  • 繼承的概念:子類可以使用父類共享的屬性和方法狸涌,避免重復代碼提高代碼復用性切省。 原型鏈:子類可以共享父類的實例對象和實...
    淺秋_6672閱讀 393評論 0 0