Swift(九)協(xié)議和擴(kuò)展

更新:2018.05.24

整理了一下demo:SwiftDemo


擴(kuò)展(Extension)

  • Swift中携添,擴(kuò)展功能(Extension)可以動(dòng)態(tài)的給類添加功能。包括在沒有權(quán)限獲取源代碼的情況下,擴(kuò)展某個(gè)類型的功能廊谓,在OC中古沥,是通過runtime來(lái)實(shí)現(xiàn)動(dòng)態(tài)調(diào)用或動(dòng)態(tài)添加功能的。
  • 現(xiàn)有的類称诗、結(jié)構(gòu)體或枚舉類型的方法萍悴,可以在擴(kuò)展的幫助下進(jìn)行添加。
  • 類型的功能可以擴(kuò)展加入寓免,但不能重寫癣诱。
  • 擴(kuò)展可以完成以下任務(wù):
    • 添加計(jì)算型屬性和計(jì)算靜態(tài)屬性。
    • 定義實(shí)例方法和類方法袜香。
    • 提供新的構(gòu)造器撕予。
    • 定義下標(biāo)。
    • 定義和使用新的嵌套類型蜈首。
    • 使一個(gè)已有類型符合某個(gè)接口实抡。

下面我們來(lái)看一個(gè)例子:

extension Int {
    var double : Int {
        return self * 2
    }
    var half : Double {
        return Double(self)/2.0
    }
    
    func bigger(num : Int) -> Int {
        if self <= num {
            return num
        } else {
            return self
        }
    }
    
}

a -> 上面例子中,我們給Int類型創(chuàng)建了針對(duì)Int的擴(kuò)展欢策,具體擴(kuò)展內(nèi)容放在大括號(hào)內(nèi)吆寨,
b -> 在括號(hào)內(nèi),給Int類型添加了2個(gè)屬性踩寇,分別用于求取當(dāng)前整數(shù)類型的值的2倍和半數(shù)的值啄清。
c -> 剛開始寫時(shí)報(bào)了一個(gè)錯(cuò),Declaration is only valid at file scope姑荷,聲明只在文件內(nèi)有效盒延,后來(lái)查了資料,發(fā)現(xiàn)鼠冕,擴(kuò)展不能寫在本類的大括號(hào)內(nèi)添寺,要寫在大括號(hào)外,就可以了懈费。

d -> 后面有添加了一個(gè)擴(kuò)展方法 bigger 比較兩個(gè)數(shù)字大小计露,下面我們來(lái)調(diào)用一下。

        
        let num:Int = 1
        print(num.double)
        print(num.half)
        print(num.bigger(num: 2))

#輸出
2
0.5 
2

e -> 可以看到,我們調(diào)用的時(shí)候也很方便票罐。

協(xié)議(protocol)

  • 協(xié)議是為方法叉趣、屬性定義的一套規(guī)范,沒有具體實(shí)現(xiàn)该押。
  • 協(xié)議可以通過一個(gè)類疗杉、結(jié)構(gòu)體、枚舉來(lái)提供協(xié)議中要求的具體實(shí)現(xiàn)蚕礼。類烟具、結(jié)構(gòu)體或枚舉都可以遵循協(xié)議,并提供具體實(shí)現(xiàn)來(lái)完成協(xié)議定義的方法和功能奠蹬。

下面我們來(lái)定義一個(gè)協(xié)議:(和擴(kuò)展一樣朝聋,要寫在本類的大括號(hào)外)

protocol Walking {
    func walk()
}

a -> 我們定義了一個(gè)Walking的協(xié)議,里面有一個(gè)方法walk囤躁。
先不著急看實(shí)現(xiàn)冀痕,先看一下協(xié)議的繼承。

protocol Runing:Walking {
    var velocity:Double{get set}
    func run()
}

b -> 這是一個(gè)繼承與Walking的協(xié)議Runing狸演,并添加了屬性velocity和方法run言蛇。協(xié)議能繼承一個(gè)或多個(gè)其他協(xié)議,多個(gè)協(xié)議之間用,分隔開严沥。

然后我們來(lái)看在類中實(shí)現(xiàn)協(xié)議

  1. 要使哪個(gè)類遵循某一協(xié)議猜极,需要在類名后面添加協(xié)議名稱,并用:分隔開消玄,作為類型定義的一部分跟伏。
  2. 當(dāng)遵循多個(gè)協(xié)議時(shí),多個(gè)協(xié)議之間用,進(jìn)行分隔翩瓜。

為了更方便演示受扳,我們?cè)谏厦娴睦又性诙嗉右粋€(gè)協(xié)議。

protocol Walking {
    func walk()
}

protocol Runing:Walking {
    var velocity:Double{get set}
    func run()
}

protocol Eating {
    func eat()
}

c -> 上面的例子中兔跌,多加了一個(gè)Eating協(xié)議勘高,然后我們定義一個(gè)類,去實(shí)現(xiàn)這些協(xié)議坟桅。


class People:Runing,Eating {
    var velocity: Double = 2.0
    
    func walk() {
        print("I`m walking")
    }
    
    func run() {
         print("I`m runing")
    }
    
    func eat() {
        print("I`m eating")
    }
    
}

d -> 上面的類中华望,遵循了2個(gè)協(xié)議 RuningEating仅乓,而Runing繼承自Walking赖舟,所以也要實(shí)現(xiàn)Walking的方法。如果協(xié)議沒有實(shí)現(xiàn)的話夸楣,系統(tǒng)會(huì)報(bào)錯(cuò)宾抓。People中子漩,實(shí)現(xiàn)了協(xié)議中的屬性velocity,實(shí)現(xiàn)的時(shí)候會(huì)發(fā)現(xiàn)是有自動(dòng)提示的石洗,然后實(shí)現(xiàn)了三個(gè)協(xié)議中的方法幢泼。

然后,我們到viewDidLoad中去調(diào)用一下協(xié)議的方法讲衫,類似于OC中的delegate缕棵,調(diào)用協(xié)議中的方法,實(shí)現(xiàn)協(xié)議方法的類就會(huì)自動(dòng)執(zhí)行協(xié)議方法焦人。

        var people3 = Peoples()
        print(people3.velocity)
        people3.eat()
        people3.run()
        people3.walk()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挥吵,一起剝皮案震驚了整個(gè)濱河市重父,隨后出現(xiàn)的幾起案子花椭,更是在濱河造成了極大的恐慌,老刑警劉巖房午,帶你破解...
    沈念sama閱讀 212,657評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矿辽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡郭厌,警方通過查閱死者的電腦和手機(jī)袋倔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,662評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)折柠,“玉大人宾娜,你說(shuō)我怎么就攤上這事∩仁郏” “怎么了前塔?”我有些...
    開封第一講書人閱讀 158,143評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)承冰。 經(jīng)常有香客問我华弓,道長(zhǎng),這世上最難降的妖魔是什么困乒? 我笑而不...
    開封第一講書人閱讀 56,732評(píng)論 1 284
  • 正文 為了忘掉前任寂屏,我火速辦了婚禮,結(jié)果婚禮上娜搂,老公的妹妹穿的比我還像新娘迁霎。我一直安慰自己,他們只是感情好百宇,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,837評(píng)論 6 386
  • 文/花漫 我一把揭開白布考廉。 她就那樣靜靜地躺著,像睡著了一般恳谎。 火紅的嫁衣襯著肌膚如雪芝此。 梳的紋絲不亂的頭發(fā)上憋肖,一...
    開封第一講書人閱讀 50,036評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音婚苹,去河邊找鬼岸更。 笑死,一個(gè)胖子當(dāng)著我的面吹牛膊升,可吹牛的內(nèi)容都是我干的怎炊。 我是一名探鬼主播,決...
    沈念sama閱讀 39,126評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼廓译,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼评肆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起非区,我...
    開封第一講書人閱讀 37,868評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瓜挽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后征绸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體久橙,經(jīng)...
    沈念sama閱讀 44,315評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,641評(píng)論 2 327
  • 正文 我和宋清朗相戀三年管怠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淆衷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,773評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渤弛,死狀恐怖祝拯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情她肯,我是刑警寧澤佳头,帶...
    沈念sama閱讀 34,470評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站辕宏,受9級(jí)特大地震影響畜晰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瑞筐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評(píng)論 3 317
  • 文/蒙蒙 一凄鼻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧聚假,春花似錦块蚌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,859評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瘪贱,卻和暖如春纱控,著一層夾襖步出監(jiān)牢的瞬間辆毡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工甜害, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舶掖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,584評(píng)論 2 362
  • 正文 我出身青樓尔店,卻偏偏與公主長(zhǎng)得像眨攘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嚣州,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,676評(píng)論 2 351

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

  • 132.轉(zhuǎn)換錯(cuò)誤成可選值 通過轉(zhuǎn)換錯(cuò)誤成一個(gè)可選值,你可以使用 try? 來(lái)處理錯(cuò)誤鲫售。當(dāng)執(zhí)行try?表達(dá)式時(shí),如果...
    無(wú)灃閱讀 1,244評(píng)論 0 3
  • 本章將會(huì)介紹 協(xié)議語(yǔ)法屬性要求方法要求(Method Requirements)Mutating 方法要求構(gòu)造器要...
    寒橋閱讀 418評(píng)論 0 3
  • 擴(kuò)展 擴(kuò)展就是向一個(gè)已有的類、結(jié)構(gòu)體该肴、枚舉類型或者協(xié)議類型添加新功能情竹。這包括在沒有權(quán)限獲取原始源代碼的情況下擴(kuò)展類...
    cht005288閱讀 463評(píng)論 0 0
  • 蘋果官方文檔翻譯 《Objective-C語(yǔ)言編程》(Programming with Objective-C) ...
    fever105閱讀 25,630評(píng)論 19 130
  • 定義: 協(xié)議定義了一個(gè)藍(lán)圖,規(guī)定了用來(lái)實(shí)現(xiàn)某一特定的任務(wù)或者功能的方法沙庐、屬性鲤妥,或其他需要的東西。類拱雏、結(jié)構(gòu)體、枚舉都...
    geekLiu閱讀 1,433評(píng)論 0 1