Swift-協(xié)議

協(xié)議概述

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

協(xié)議的定義
protocol Preson{
    //協(xié)議內(nèi)容
}
協(xié)議對屬性的要求

1.對于可讀可寫的的屬性,則實(shí)現(xiàn)屬性不能是常量存儲屬性或只讀的存儲屬性
2.對于只讀的屬性,則實(shí)現(xiàn)屬性可以是任意類型的屬性。
3.允許為只讀屬性實(shí)現(xiàn)有效的set方法。

協(xié)議對方法的要求

1.方法不需要方法體
2.方法不可以有名默認(rèn)值

//(協(xié)議的定義)
protocol Preson{
    var name:String{get set}
    var age:Int{get}
    func feed(food:String)
    func shout(sound:String)
}
協(xié)議的遵循

協(xié)議的規(guī)則要用來進(jìn)行遵循。

class 類:父類,協(xié)議{
    
}
含義:類繼承某個父類,同時遵循協(xié)議

實(shí)現(xiàn)協(xié)議中的屬性
1、屬性可以設(shè)置默認(rèn)值
2、協(xié)議中屬性為可讀可寫,必須聲明為var
3、協(xié)議中屬性為可讀的,實(shí)現(xiàn)中可以聲明let或者var

實(shí)現(xiàn)協(xié)議中的方法
1、方法中的參數(shù)可以傳默認(rèn)值

//(協(xié)議的定義)
protocol Preson{
    var name:String{get set}
    var age:Int{get}
    func feed(food:String)
    func shout(sound:String)
}

//(協(xié)議的遵循)
class Cat:Preson{
    var name:String = "heihei"
    let age:Int = 18
    func feed(food:String){
        print("feed\(food)")
    }
    func shout(sound:String = "xiaohei"){
        print("shout\(sound)")
    }
}
協(xié)議的繼承

協(xié)議之間可以繼承,它的語法格式與類的繼承相似,
不同的是,協(xié)議可以同時繼承自多個協(xié)議也就是多繼承。

protocol Protocol1{
    func playBasketball()
    func playFootball()
}
//讓第二個協(xié)議去繼承第一個協(xié)議相當(dāng)于3個協(xié)議
protocol Protocol2:Protocol1{
    func studyJava()
}
//實(shí)現(xiàn)幾個方法? 實(shí)現(xiàn)協(xié)議中的所有方法
class Student:Protocol2{
    func studyJava() {
        <#code#>
    }
    
    func playBasketball() {
        <#code#>
    }    
    func playFootball() {
        <#code#>
    }
}
協(xié)議中方法可選

在方法前添加@objc optional;在協(xié)議前用@objc修飾
注意:@objc實(shí)在foundation框架中,如果注釋掉import 會報(bào)錯

@objc protocol Protocol1{
    @objc optional func playBasketball()
    func playFootball()
}

class Student:Protocol1{
    func playFootball() {
        <#code#>
    }
}
協(xié)議的運(yùn)用

代理模式的基礎(chǔ)就是協(xié)議
比如生活中我們可以委托別人幫我們?nèi)ジ梢患?/p>

protocol BuyVegetabalesProtocol{//凡是實(shí)現(xiàn)這個協(xié)議的人,我都可以讓他幫我買菜
    func buyVegetabales()
}
class PenYou:BuyVegetabalesProtocol{
    func buyVegetabales() {
        print("朋友去買菜")
    }
}
class JiaRen:BuyVegetabalesProtocol{
    func buyVegetabales() {
        print("家人去買菜")
    }
}
class Boss{
    var delegate:BuyVegetabalesProtocol
    init(delegate:BuyVegetabalesProtocol) {
        self.delegate = delegate
    }
    func gotoBJ(){
        //買菜
        delegate.buyVegetabales()
        print("菜到手,去做美食")
    }
}
var boss = Boss(delegate: JiaRen())
boss.gotoBJ()
boss = Boss(delegate:PenYou())
boss.gotoBJ()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容