swift 協(xié)議(protocol)

swift中的協(xié)議用于定義方法和屬性,但是協(xié)議本身并不進(jìn)行實(shí)現(xiàn)提佣,而是由采納該協(xié)議的類進(jìn)行實(shí)現(xiàn)吮蛹。

一、協(xié)議里邊可以定義屬性镐依、方法匹涮、構(gòu)造函數(shù)等。

1.對(duì)于可讀可寫(xiě)的屬性槐壳,則實(shí)現(xiàn)屬性不能使常量存儲(chǔ)屬性或只讀的計(jì)算型屬性
2.對(duì)于只讀的屬性然低,則實(shí)現(xiàn)屬性可以是任意類型的屬性
3.允許為只讀屬性實(shí)現(xiàn)有效的setter方法

protocol PersonProtocol{
    var age:Int{get set} //聲明為可讀可寫(xiě)屬性
    var name:String{get} //聲明為只讀屬性
    static var sex:String{get set} //聲明為類型屬性
}


protocol Person{
    var fullName:String {get}
    func description()
    //可變方法
    //結(jié)構(gòu)體和枚舉能夠通過(guò)采納協(xié)議,對(duì)協(xié)議的可變方法進(jìn)行實(shí)現(xiàn)务唐,從而改變本身的值雳攘。而類在實(shí)現(xiàn)可變方法時(shí),要省略mutation關(guān)鍵字
    mutating func descriptionM()
    init(name:String, fullName:String)
}

class Teacher : Person{
    var name:String
    init(name:String) {
        self.name = name
    }
    var fullName: String{
        return self.name+"全"
    }
    func description() { //普通方法枫笛,類方法一樣
        print("I am description")
    }
    func descriptionM(){
        self.name = "王"
        print(self.name,"全")
    }
    //如果需要實(shí)現(xiàn)協(xié)議里邊的構(gòu)造方法必須加上required關(guān)鍵字吨灭,是為了保證該類的所有子類要滿足協(xié)議的要求
    //如果該類有final修飾 則不用加required關(guān)鍵字,因?yàn)閒inal修飾的類不能被繼承
     required init(name: String, fullName: String) {
        self.name = name
    }
}

let tea = Teacher(name:"小李子")
print(tea.fullName)
tea.description()
tea.descriptionM()

let tea2 = Teacher(name:"小陳", fullName:"小袁")
print(tea2.name)

//可選協(xié)議刑巧,  只能被類采納
import UIKit
@objc protocol Animal{
    //定義可選方法 類可自動(dòng)選擇是否實(shí)現(xiàn)該方法
    @objc optional func run()
}

class Cat : Animal{
    @objc func run() {
        print("run")
    }
}
let cat = Cat()
cat.run()

控制臺(tái):

小李子全
I am description
王 全
小陳
run

二喧兄、協(xié)議作為類型使用

下邊列舉一個(gè)例子,把協(xié)議當(dāng)做參數(shù)來(lái)使用啊楚,其實(shí)就是該參數(shù)需要傳入一個(gè)采納了該協(xié)議的類或結(jié)構(gòu)體或枚舉的實(shí)例

//協(xié)議作為類型使用
protocol Name{
    var name:String{get}
}

class Person:Name{
    var name: String{
        return "name"
    }
}

func A(param:Name){
    print(param.name)
}

A(param:Person())

控制臺(tái):

name

協(xié)議的合成吠冤,如果多個(gè)協(xié)議當(dāng)做類型使用時(shí),方法如下

protocol A(){}
protocol B(){}
func C(param:protocol<A,B>){}
//這時(shí)候調(diào)用C方法就需要傳入一個(gè)同時(shí)采納了AB兩個(gè)協(xié)議的實(shí)例
三恭理、協(xié)議的繼承

協(xié)議之間也可以繼承拯辙,跟類的繼承相似,但是協(xié)議允許多繼承颜价。用逗號(hào)分隔

protocol A : B,C(){}//A協(xié)議繼承了B涯保、C兩個(gè)協(xié)議
四、檢查協(xié)議的一致性
  • 使用is操作符檢查實(shí)例是否采納了某個(gè)協(xié)議
  • 使用as操作符把實(shí)例類型轉(zhuǎn)換到指定的協(xié)議類型
    這里簡(jiǎn)直跟類里邊的使用方法一模一樣周伦,不再贅述
    is操作符
    as操作符
五夕春、代理模式

講到代理模式就厲害了,我很喜歡這個(gè)横辆,也比較容易學(xué)撇他。
看下邊的代碼 簡(jiǎn)直是通俗易懂茄猫,高大上

protocol Take{
    func take()
}

class Student:Take{
    func take(){
        print("student去借粉筆")
    }
}

class Teacher{
    var delegate:Take
    init(delegate:Take){
        self.delegate = delegate
    }
    func talk(){
        delegate.take()
    }
}

let stu = Student()
let Tea = Teacher(delegate:stu)
Tea.talk()

控制臺(tái):

student去借粉筆
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市困肩,隨后出現(xiàn)的幾起案子划纽,更是在濱河造成了極大的恐慌,老刑警劉巖锌畸,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勇劣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡潭枣,警方通過(guò)查閱死者的電腦和手機(jī)比默,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盆犁,“玉大人命咐,你說(shuō)我怎么就攤上這事⌒乘辏” “怎么了醋奠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)伊佃。 經(jīng)常有香客問(wèn)我窜司,道長(zhǎng),這世上最難降的妖魔是什么航揉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任塞祈,我火速辦了婚禮,結(jié)果婚禮上帅涂,老公的妹妹穿的比我還像新娘议薪。我一直安慰自己,他們只是感情好媳友,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布笙蒙。 她就那樣靜靜地躺著,像睡著了一般庆锦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轧葛,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天搂抒,我揣著相機(jī)與錄音,去河邊找鬼尿扯。 笑死求晶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衷笋。 我是一名探鬼主播芳杏,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了爵赵?” 一聲冷哼從身側(cè)響起吝秕,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎空幻,沒(méi)想到半個(gè)月后烁峭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秕铛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年约郁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片但两。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鬓梅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谨湘,到底是詐尸還是另有隱情绽快,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布悲关,位于F島的核電站谎僻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏寓辱。R本人自食惡果不足惜艘绍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秫筏。 院中可真熱鬧诱鞠,春花似錦、人聲如沸这敬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)崔涂。三九已至阳掐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冷蚂,已是汗流浹背缭保。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蝙茶,地道東北人艺骂。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像隆夯,于是被迫代替她去往敵國(guó)和親钳恕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子别伏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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

  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 10,970評(píng)論 6 13
  • 協(xié)議定義了一個(gè)藍(lán)圖,規(guī)定了用來(lái)實(shí)現(xiàn)某一特定任務(wù)或者功能的方法忧额、屬性厘肮,以及其他需要的東西。類宙址、結(jié)構(gòu)體 或枚舉都可以遵...
    GY1994閱讀 1,392評(píng)論 0 0
  • 1轴脐、范型范型所解決的問(wèn)題 函數(shù)、方法抡砂、類型:類大咱,結(jié)構(gòu)體,枚舉注益,元組類型碴巾,協(xié)議參數(shù),返回值丑搔,成員函數(shù)參數(shù)厦瓢,成員屬性類...
    我是小胡胡123閱讀 829評(píng)論 0 1
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,806評(píng)論 1 10
  • 132.轉(zhuǎn)換錯(cuò)誤成可選值 通過(guò)轉(zhuǎn)換錯(cuò)誤成一個(gè)可選值,你可以使用 try? 來(lái)處理錯(cuò)誤。當(dāng)執(zhí)行try?表達(dá)式時(shí),如果...
    無(wú)灃閱讀 1,251評(píng)論 0 3