20.Swift學習之協(xié)議

協(xié)議

協(xié)議為方法鸠项、屬性作媚、以及其他特定的任務需求或功能定義一個大致的框架。協(xié)議可被類、結(jié)構(gòu)體阐肤、或枚舉類型采納以提供所需功能的具體實現(xiàn)缴罗。滿足了協(xié)議中需求的任意類型都叫做遵循了該協(xié)議况芒。

協(xié)議的定義

  • 協(xié)議的定義方式與類肥惭,結(jié)構(gòu)體,枚舉的定義都非常相似
protocol SomeProtocol {
    // 屬性
    // 方法
}
  • 協(xié)議中的屬性

    • 不可以有默認值
    • 必須設置是{get}或者{get set} 喇聊,注意:get與set之間是沒有逗號的
    • 必須設置為var
  • 協(xié)議中的方法

    • 可以定義普通方法也可以是mutating方法
    • 方法不能有方法體
    • 方法的參數(shù)不可以有默認值
protocol Pet {
    // 定義屬性
    var name: String {get set}
    var age: Int {get}
    // 定義方法
    func feed(food: String)
    mutating func shout(sound :String);
}

協(xié)議的遵守格式(實現(xiàn)協(xié)議)

  • 格式
class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol {
    // 類的內(nèi)容
    // 實現(xiàn)協(xié)議中的方法
}
  • 實現(xiàn)協(xié)議中的屬性
    • 此時屬性可以設置默認值
    • 協(xié)議中屬性為可讀可寫的恍风,可以直接聲明為var類型就可以
    • 協(xié)議中屬性為可讀屬性,可以直接聲明為let類型就可以誓篱,也可以聲明為var類型
  • 實現(xiàn)協(xié)議中的方法
    • 可以為方法中的參數(shù)設置默認值
    • 在結(jié)構(gòu)體中朋贬,如果需要改變自身的值,需要在方法前面加mutating關鍵字窜骄。在協(xié)議的方法中添加mutating關鍵字锦募,如果結(jié)構(gòu)體來遵守協(xié)議,需要有mutating這個關鍵字邻遏,如果是類來遵守協(xié)議糠亩,mutating關鍵字就不需要了虐骑。
class Cat : Pet{
    //屬性可以設置默認值
    //可讀可寫用var
    var name: String = "Dingding"
    //只讀可以用let
    let age: Int = 10
    func feed(food: String) {
        print("feed\(food)")
    }
    //方法參數(shù)可以有默認值
    //類實現(xiàn)mutating方法要修改屬性值時必須加不用加mutating
    func shout(sound: String = "miaomiao") {
        self.name = "Caicai"
        print("shout\(sound)")
    }
}

struct Dog : Pet{
    var name: String
    var age: Int
    func feed(food: String) {
        print("feed\(food)")
    }
    //結(jié)構(gòu)體實現(xiàn)mutating方法要修改屬性值時必須加mutating
    mutating func shout(sound: String) {
        self.name = "Guaiguai"
        print("shout\(sound)")
    }
}
  • 協(xié)議之間的繼承
protocol CrazySportProtocol {
    func jumping()
}
//繼承協(xié)議
protocol SportProtocol : CrazySportProtocol {
    func playBasketball()
    func playFootball()
}
//此時的類必須所有方法都實現(xiàn)
class Person:SportProtocol{
    func playBasketball() {
        print("playBasketball")
    }    
    func playFootball() {
        print("playFootball")
    }    
    func jumping() {
        print("jumping")
    }
}

協(xié)議中方法的可選

方法一
  • 定義協(xié)議
@objc protocol SportProtocol2 {
     // 該方法可選
    @objc optional func playBasketball()
    func playFootball()
}
  • 遵守協(xié)議
class Person : SportProtocol2 {
    var name : String?
    var age : Int = 0
    // 實現(xiàn)協(xié)議中的方法,此時可以不實現(xiàn)協(xié)議中的可選方法赎线,當然也可以實現(xiàn)
    func playBasketball() {
        print("人在打籃球")
    }
}
方法二

擴展協(xié)議

protocol SomeProtocol {
    func requiredFunc()
    func optionalFunc()
}

extension SomeProtocol {
    func optionalFunc() {
      print("optionalFunc擴展中實現(xiàn)")
    }
}

class SomeClass: SomeProtocol {
    func requiredFunc() {
      print("requiredFunc具體類中實現(xiàn)")
    }
}

協(xié)議的運用——代理模式

//1.定義一個協(xié)議廷没,規(guī)定需要完成的任務
protocol BuyTicketProtocol {
    func buyTicket()
}
//2.讓具體的類或者結(jié)構(gòu)體實現(xiàn)協(xié)議,將任務具體化
class Assist : BuyTicketProtocol{
    func buyTicket() {
        print("助手去買票")
    }
}

class HN : BuyTicketProtocol{
    func buyTicket() {
        print("黃牛去買票")
    }
}
//3.委托方申明一個屬性(遵循協(xié)議)垂寥,然后在真正需要完成任務的時候調(diào)用屬性來完成
class Person {
    // 1.定義協(xié)議屬性
    var delegate : BuyTicketProtocol

    // 2.自定義構(gòu)造函數(shù)
    init (delegate : BuyTicketProtocol) {
        self.delegate = delegate
    }

    // 3.行為
    func goToBeijing() {
        print("找代理買票")
        delegate.buyTicket()
        print("拿到票去北京")
    }
}
let p = Person(delegate: HN())
p.goToBeijing()
let p2 = Person(delegate: Assist())
p2.goToBeijing()
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颠黎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子滞项,更是在濱河造成了極大的恐慌狭归,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件文判,死亡現(xiàn)場離奇詭異过椎,居然都是意外死亡,警方通過查閱死者的電腦和手機戏仓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門疚宇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柜去,你說我怎么就攤上這事灰嫉。” “怎么了嗓奢?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浑厚。 經(jīng)常有香客問我股耽,道長,這世上最難降的妖魔是什么钳幅? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任物蝙,我火速辦了婚禮,結(jié)果婚禮上敢艰,老公的妹妹穿的比我還像新娘诬乞。我一直安慰自己,他們只是感情好钠导,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布震嫉。 她就那樣靜靜地躺著,像睡著了一般牡属。 火紅的嫁衣襯著肌膚如雪票堵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天逮栅,我揣著相機與錄音悴势,去河邊找鬼窗宇。 笑死,一個胖子當著我的面吹牛特纤,可吹牛的內(nèi)容都是我干的军俊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捧存,長吁一口氣:“原來是場噩夢啊……” “哼粪躬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起矗蕊,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤短蜕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后傻咖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朋魔,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年卿操,在試婚紗的時候發(fā)現(xiàn)自己被綠了警检。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡害淤,死狀恐怖扇雕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窥摄,我是刑警寧澤镶奉,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站崭放,受9級特大地震影響哨苛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜币砂,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一建峭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧决摧,春花似錦亿蒸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拘鞋,卻和暖如春砚蓬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盆色。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工灰蛙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留祟剔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓摩梧,卻偏偏與公主長得像物延,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仅父,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

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