Swift-協(xié)議

一、概覽
Swift協(xié)議.png
二泊业、協(xié)議的定義和遵守
/* Swift協(xié)議
  1.可以定義方法、屬性啊易、下標(biāo)吁伺,屬性只能是var類型且不能寫初始值,表明讀寫性即可(包括類型屬性)
  2.協(xié)議中定義的內(nèi)容默認(rèn)都是必須實(shí)現(xiàn)的
  3.協(xié)議可以extension, 在擴(kuò)展中提供方法、屬性租谈、下標(biāo)的默認(rèn)實(shí)現(xiàn)后篮奄,
    這些方法、屬性、下標(biāo)就變成可選實(shí)現(xiàn)的了;
  4.協(xié)議中mutating修飾方法窟却,如果是值類型遵守協(xié)議時(shí)昼丑,
    方法中修改了自身內(nèi)存要加mutating,不修改時(shí)可以不加mutating
  5.聲明的初始化器夸赫,類中必須以required實(shí)現(xiàn)或者是final的類菩帝;
    枚舉和結(jié)構(gòu)體中也必須實(shí)現(xiàn)但不用加required(枚舉實(shí)現(xiàn)初始化器可以給self賦值一個(gè))
 */
protocol ZLRunable {
    // 1.協(xié)議中定義屬性,只能是var茬腿,寫法是后面表明讀寫即可
    //  a.在實(shí)現(xiàn)協(xié)議中對(duì)應(yīng)變量時(shí)呼奢,讀寫權(quán)限不小于協(xié)議中即可,并且可以是存儲(chǔ)屬性也可以是計(jì)算屬性
    var speed: Int { set get }
    //  b.在實(shí)現(xiàn)協(xié)議中只讀的屬性時(shí)滓彰,如果是用存儲(chǔ)屬性實(shí)現(xiàn)控妻,可以是let州袒,也可以是var
    var startTime: Int { get }
    
    // 2.對(duì)于類型屬性揭绑,在協(xié)議中定義也是表明讀寫權(quán)限,實(shí)現(xiàn)時(shí)不小于協(xié)議中權(quán)限
    // 如果是類中實(shí)現(xiàn)類型屬性郎哭,并且是用類型計(jì)算屬性實(shí)現(xiàn)他匪,可以用static和class修飾
    static var name: String { get }
    
    // 3.定義方法和類型方法不需要寫實(shí)現(xiàn)
    func run()
    
    // 4.如果是在類中實(shí)現(xiàn)類型方法,可以將static改為class修飾
    static func bark()
    
    // 5.下標(biāo)夸研、類型下標(biāo)方法跟屬性是類似的
    /* static */subscript(minute: Int) -> Int { set get }
    
    // 6.mutating方法用于表示如果是值類型遵守協(xié)議邦蜜,表明可能會(huì)涉及到修改自身變量值
    //  a.類中實(shí)現(xiàn)不需要加mutating,值類型中實(shí)現(xiàn)時(shí)如果方法不涉及修改自身變量也可以不加mutating
    //  b.協(xié)議中如果不寫mutating亥至,值類型遵守協(xié)議時(shí)悼沈,方法寫了mutating,那么構(gòu)成重載姐扮,還是要實(shí)現(xiàn)沒(méi)有mutating的方法
    mutating func mutateFunc()
    
    // 7.協(xié)議中聲明的初始化方法絮供,協(xié)議擴(kuò)展中不能自定義實(shí)現(xiàn)
    // 類中必須以required實(shí)現(xiàn)或者是final的類;值類型中也必須實(shí)現(xiàn)但不用加required;
    // 枚舉實(shí)現(xiàn)初始化器可以給self賦值一個(gè)
    init(with no: Int, age: Int)
}

/* Swift協(xié)議擴(kuò)展
 1.提供方法的默認(rèn)實(shí)現(xiàn)茶敏,這個(gè)方法就變成可選實(shí)現(xiàn)
 2.提供屬性的默認(rèn)實(shí)現(xiàn)時(shí)壤靶,只能實(shí)現(xiàn)為計(jì)算屬性,
   且如果默認(rèn)實(shí)現(xiàn)的屬性的讀寫權(quán)限小于協(xié)議中聲明惊搏,則還是必須實(shí)現(xiàn)的屬性
 3.協(xié)議擴(kuò)展中可以新加方法和類型方法贮乳,外部不能直接通過(guò)協(xié)議調(diào)用,需要通過(guò)遵守協(xié)議的類型調(diào)用恬惯,
   且如果遵守協(xié)議后重寫了方法向拆,則調(diào)用重寫的,沒(méi)有重寫則調(diào)用協(xié)議中的(重寫不需要加override)
 4.協(xié)議擴(kuò)展中方法酪耳、屬性浓恳、下標(biāo)都是要自己實(shí)現(xiàn)的,不能僅僅是聲明
 5.協(xié)議擴(kuò)展中不能寫初始化方法的實(shí)現(xiàn)
 */
extension ZLRunable {
    // 1.提供方法的默認(rèn)實(shí)現(xiàn),這個(gè)方法就變成可選實(shí)現(xiàn)
    func run() {
        print("run---")
    }
    
    // 2.默認(rèn)實(shí)現(xiàn)屬性時(shí)奖蔓,如果讀寫權(quán)限小于協(xié)議中規(guī)定赞草,那么屬性還是必須實(shí)現(xiàn)的
    //  如果有set、get時(shí)吆鹤,這個(gè)屬性就是可選實(shí)現(xiàn)的
    var speed: Int {
        set {}// 沒(méi)有這個(gè)set厨疙,這個(gè)屬性還是必須實(shí)現(xiàn)的
        get { 1 }
    }
    
    // 3.實(shí)現(xiàn)下標(biāo)后,下標(biāo)變成可選實(shí)現(xiàn)
    subscript(minute: Int) -> Int {
        set {}
        get { 1 }
    }
    
    // 4.新加的方法:外部通過(guò)遵守協(xié)議類型的實(shí)例調(diào)用疑务,如果有自己的實(shí)現(xiàn)沾凄,則調(diào)用自己的
    public func extensionFunc1() {
        print("ZLRunable.extension.extensionFunc1--")
    }
    
    // 5.新加的類型方法:外部通過(guò)遵守協(xié)議類型調(diào)用,如果有自己的實(shí)現(xiàn)知允,則調(diào)用自己的
    public static func extensionFunc2() {
        print("ZLRunable.extension.extensionFunc2--")
    }
}
二撒蟀、協(xié)議的繼承和限定類遵守
/* Swift協(xié)議繼承
 0.只能繼承類和協(xié)議,并且最多能繼承一個(gè)類温鸽,協(xié)議不限數(shù)量
 1.協(xié)議中會(huì)擁有繼承的所有協(xié)議的接口保屯。
 2.需要限定只能由類來(lái)遵守,可以繼承AnyObject涤垫,AnyObject從這里看來(lái)是一個(gè)協(xié)議
 3.可以繼承一個(gè)類姑尺,這樣的話,只能是這個(gè)類的子類遵守,并且協(xié)議不再需要遵守AnyObject
 5.如果不遵守AnyObject蝠猬,代表(枚舉切蟋、結(jié)構(gòu)體)值類型也可以遵守這個(gè)協(xié)議
 */
protocol ZLJumpable: ZLRabbit,/* AnyObject,*/ ZLRunable, CustomStringConvertible {
    // ZLRabbit是個(gè)類,所以再遵守AnyObject是冗余的
}
三榆芦、方法參數(shù)要求多個(gè)協(xié)議
/// 例子:參數(shù)屬于某個(gè)類型柄粹,且需要遵守多個(gè)協(xié)議,使用&連接
func testProtocol(abc: UIView & CaseIterable & RawRepresentable) {
    // do some thing
}
四匆绣、OC協(xié)議兼容

OC中協(xié)議都繼承NSObject協(xié)議驻右,并且只能是類遵守。
對(duì)于Swift協(xié)議犬绒,要實(shí)現(xiàn)可選協(xié)議可以在協(xié)議的extension中提供默認(rèn)實(shí)現(xiàn)旺入;還有一種方式就是使用如下oc兼容的方式:

@objc// 修飾后,swift中只有類凯力、協(xié)議能遵守這個(gè)協(xié)議茵瘾;OC中也能使用這個(gè)協(xié)議
protocol ZLOCprotocol {
    // 1.這個(gè)方法是可選實(shí)現(xiàn)的,用optional修飾咐鹤,用了optional后拗秘,必須用@objc修飾
    // 在swift的類中遵守協(xié)議實(shí)現(xiàn)下面方法不需要用@objc修飾
    @objc optional func optionalFunc1()
    
    // 這個(gè)方法在Swift中必須實(shí)現(xiàn)的,OC中是可選實(shí)現(xiàn)
    // 不需要使用@objc修飾, 沒(méi)有用@objc也是可以在OC中使用
    // 遵守協(xié)議后祈惶,如果是Swift中雕旨,不實(shí)現(xiàn)會(huì)報(bào)錯(cuò)扮匠;如果是OC中,不實(shí)現(xiàn)不會(huì)報(bào)錯(cuò)凡涩,運(yùn)行時(shí)調(diào)用方法時(shí)奔潰
    func func2()
}

如果想要NSObject的類才能遵守棒搜,協(xié)議遵守NSObjectProtocol即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末活箕,一起剝皮案震驚了整個(gè)濱河市力麸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌育韩,老刑警劉巖克蚂,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異筋讨,居然都是意外死亡埃叭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門悉罕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赤屋,“玉大人,你說(shuō)我怎么就攤上這事蛮粮∫娑校” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵然想,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我欣范,道長(zhǎng)变泄,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任恼琼,我火速辦了婚禮妨蛹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晴竞。我一直安慰自己蛙卤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布噩死。 她就那樣靜靜地躺著颤难,像睡著了一般。 火紅的嫁衣襯著肌膚如雪已维。 梳的紋絲不亂的頭發(fā)上行嗤,一...
    開(kāi)封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音垛耳,去河邊找鬼栅屏。 笑死飘千,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的栈雳。 我是一名探鬼主播护奈,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼哥纫!你這毒婦竟也來(lái)了逆济?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤磺箕,失蹤者是張志新(化名)和其女友劉穎奖慌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體松靡,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡简僧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雕欺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岛马。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖屠列,靈堂內(nèi)的尸體忽然破棺而出啦逆,到底是詐尸還是另有隱情,我是刑警寧澤笛洛,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布夏志,位于F島的核電站研侣,受9級(jí)特大地震影響回溺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矫膨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一狱杰、第九天 我趴在偏房一處隱蔽的房頂上張望瘦材。 院中可真熱鬧,春花似錦仿畸、人聲如沸食棕。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)簿晓。三九已至,卻和暖如春甥捺,著一層夾襖步出監(jiān)牢的瞬間抢蚀,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工镰禾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留皿曲,地道東北人唱逢。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像屋休,于是被迫代替她去往敵國(guó)和親坞古。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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

  • 最近項(xiàng)目使用的是OC劫樟,后頭看之前用Swift開(kāi)發(fā)的一個(gè)項(xiàng)目時(shí)痪枫,發(fā)現(xiàn)很多細(xì)節(jié)都忘記了????。為了回憶和以后方便查看叠艳,現(xiàn)...
    wg剛閱讀 467評(píng)論 1 4
  • 協(xié)議 設(shè)置協(xié)議后有自動(dòng)補(bǔ)齊奶陈,而且是必實(shí)現(xiàn),不然會(huì)報(bào)錯(cuò)的附较。 Static吃粒、class 為了保證類與結(jié)構(gòu)體都能夠使用,...
    MissSunRise閱讀 427評(píng)論 0 0
  • 協(xié)議概述 Swift中的協(xié)議用于定義方法和屬性拒课,但協(xié)議本身并不進(jìn)行實(shí)現(xiàn)徐勃,而是采納該協(xié)議的類具體實(shí)現(xiàn)。 協(xié)議的定義 ...
    床前明月光q閱讀 253評(píng)論 0 0
  • 協(xié)議的命名遵循 Swift 的標(biāo)準(zhǔn)庫(kù), 即協(xié)議名以 "Type"早像, "-able"僻肖, "-ible" 結(jié)尾 例如 ...
    焉知非魚閱讀 6,034評(píng)論 3 5
  • 1.Swift中的Protocol 什么是Protocol? Protocol是Swift中的一種自定義類型卢鹦,可以...
    楓葉1234閱讀 1,489評(píng)論 1 3