Swift 協(xié)議

Swift.png
協(xié)議的簡單介紹
  • 規(guī)定了用來實現(xiàn)某一特定任務(wù)或者功能的方法括堤、屬性砖第,以及其他需要的東西
  • 類斟或、結(jié)構(gòu)體 或枚舉都可以遵循協(xié)議素征,并為協(xié)議定義的這些要求提供具體實現(xiàn)(必須要實現(xiàn)協(xié)議的屬性或者方法)
  • 協(xié)議的格式:協(xié)議的定義方式與類、結(jié)構(gòu)體和枚舉的定義非常相似
protocol SomeProtocol {
// 這里是協(xié)議的定義部分
}
  • 要讓自定義類型遵循某個協(xié)議,在定義類型時御毅,需要在類型名稱后加上協(xié)議名稱根欧,中間以冒號( : )分隔。遵循 多個協(xié)議時端蛆,各協(xié)議之間用逗號( , )分隔
struct SomeStructure: FirstProtocol, AnotherProtocol { // 這里是結(jié)構(gòu)體的定義部分
}
  • 擁有父類的類在遵循協(xié)議時咽块,應(yīng)該將父類名放在協(xié)議名之前,以逗號分隔

class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol { // 這里是類的定義部分
}

  • 協(xié)議是可以繼承的欺税,一個協(xié)議可以繼承另外一個協(xié)議
屬性的要求
  • 協(xié)議可以要求遵循協(xié)議的類型提供特定名稱和類型的實例屬性或類型屬性。
  • 協(xié)議不指定屬性是存儲型屬性還是計算型屬性揭璃,它只指定屬性的名稱和類型晚凿。
  • 協(xié)議還指定屬性是可讀的還是可讀可寫的。
    • 如果協(xié)議要求屬性是可讀可寫的瘦馍,那么該屬性不能是常量屬性或只讀的計算型屬性
    • 如果協(xié)議只要求屬性是可讀的歼秽,那么該屬性不僅可以是可讀的,如果代碼需要的話情组,還可以是可寫的燥筷。
  • 協(xié)議總是用 var 關(guān)鍵字來聲明變量屬性,在類型聲明后加上 { set get } 來表示屬性是可讀可寫的院崇,可讀屬性則用 { get } 來表示
protocol SomeProtocol {
    var mustBeSettable: Int { get set }
    var doesNotNeedToBeSettable: Int { get }
}
  • 在聲明 類型屬性的時候可以使用 static或者 class關(guān)鍵字

//例子

//定義一個協(xié)議
protocol Work{
    var type:String {get set}
    var name:String {get set}
}

struct Type:Work{
  //類型必須聲明協(xié)議里面的屬性
    var type: String;
    var name: String;
}
//結(jié)構(gòu)體有逐一構(gòu)造器
let t = Type(type: "互聯(lián)網(wǎng)", name: "IT部門");
t.type
t.name
//打铀撩ァ:"互聯(lián)網(wǎng)"    "IT部門"

方法
  • 協(xié)議可以要求遵循協(xié)議的類型實現(xiàn)某些指定的實例方法或類方法
  • 協(xié)議里面定義的方法不需要大括號和方法體
  • 用 static或者class定義類型方法
//定義一個協(xié)議
protocol Run {
    
    func directionRun();
}


//定義一個枚舉
enum Direction:Run {
    
    case left
    case right
    case up
    case down
    func directionRun() {
        print("跑的方向")
    }
}

Direction.left.directionRun();

  • 將 mutating 關(guān)鍵 字作為方法的前綴,寫在 func 關(guān)鍵字之前底瓣,表示可以在該方法中修改它所屬的實例以及實例的任意屬性的值(在值類型中谢揪,主要是結(jié)構(gòu)體和枚舉中)
  • Mutating 方法:需要在方法中改變方法所屬的實例
  • 如果遵循協(xié)議的是 類 則不用寫 mutating 關(guān)鍵字,而對于結(jié)構(gòu)體和枚舉捐凭,則必須寫
    mutating 關(guān)鍵字拨扶。
//定義一個協(xié)議
protocol Togglable {
    mutating func toggle()
}

//定義一個枚舉 遵循協(xié)議Togglable
enum OnOffSwitch: Togglable {
    case Off, On
//更改自身的實例屬性
    mutating func toggle() {
        switch self {
        case .Off:
            self = .On
        case .On:
            self = .Off
          } 
     }
}



var lightSwitch = OnOffSwitch.Off;
lightSwitch.toggle()
// lightSwitch 現(xiàn)在的值為 .On

構(gòu)造器
  • 協(xié)議可以要求遵循協(xié)議的類型實現(xiàn)指定的構(gòu)造器
protocol SomeProtocol {
    init(someParameter: Int)
}
  • 你可以在遵循協(xié)議的類中實現(xiàn)構(gòu)造器,無論是作為指定構(gòu)造器茁肠,還是作為便利構(gòu)造器患民。無論哪種情況,你都必須 為構(gòu)造器實現(xiàn)標(biāo)上 required 修飾符
class SomeClass: SomeProtocol {
    required init(someParameter: Int) {
// 這里是構(gòu)造器的實現(xiàn)部分 }
}
  • 如果類已經(jīng)被標(biāo)記為 final 垦梆,那么不需要在協(xié)議構(gòu)造器的實現(xiàn)中使用 required 修飾符匹颤,因為 final 類不能有子類

  • 如果一個子類重寫了父類的指定構(gòu)造器,并且該構(gòu)造器滿足了某個協(xié)議的要求奶赔,那么該構(gòu)造器的實現(xiàn)需要同時標(biāo) 注 required 和 override 修飾符

protocol SomeProtocol {
    init()
}
class SomeSuperClass {
    init() {
// 這里是構(gòu)造器的實現(xiàn)部分
     }
}
class SomeSubClass: SomeSuperClass, SomeProtocol { // 因為遵循協(xié)議惋嚎,需要加上 required
// 因為繼承自父類,需要加上 override
required override init() {
// 這里是構(gòu)造器的實現(xiàn)部分
     }
}
代理
  • 代理(委托)是一種設(shè)計模式站刑,允許類或結(jié)構(gòu)體將一些需要它們負(fù)責(zé)的功能委托給其他類型的實例
//協(xié)議:遵循class類 方便delege屬性 weak
protocol Work:class {
    
    func test();
}

//工作的員工
class Person:Work {
    func test() {
        print("開始工作");
    }
    
}

//寵物狗
class Dog: Work {
    func test() {
        print("旺旺")
        
    }
}

//老板
class Master {
//weak:是修飾 類類型的
   weak var delegate:Work?
}

let M = Master();
//設(shè)置代理
M.delegate = Dog();
M.delegate?.test()

讓協(xié)議的方法可選
  • 在OC的協(xié)議中方法可以實現(xiàn)也可以不實現(xiàn)另伍,但是在Swift中的協(xié)議中 方法必須要實現(xiàn),解決方法 方swift中的協(xié)議 轉(zhuǎn)化成OC 中協(xié)議

@objc
protocol Work {
    //可選擇實現(xiàn) 方法
    @objc optional func test();
    
}

class Person:Work {
    
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市摆尝,隨后出現(xiàn)的幾起案子温艇,更是在濱河造成了極大的恐慌,老刑警劉巖堕汞,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勺爱,死亡現(xiàn)場離奇詭異,居然都是意外死亡讯检,警方通過查閱死者的電腦和手機(jī)琐鲁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來人灼,“玉大人围段,你說我怎么就攤上這事⊥斗牛” “怎么了奈泪?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長灸芳。 經(jīng)常有香客問我涝桅,道長,這世上最難降的妖魔是什么烙样? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任冯遂,我火速辦了婚禮,結(jié)果婚禮上误阻,老公的妹妹穿的比我還像新娘债蜜。我一直安慰自己,他們只是感情好究反,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布寻定。 她就那樣靜靜地躺著,像睡著了一般精耐。 火紅的嫁衣襯著肌膚如雪狼速。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天卦停,我揣著相機(jī)與錄音向胡,去河邊找鬼。 笑死惊完,一個胖子當(dāng)著我的面吹牛僵芹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播小槐,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼拇派,長吁一口氣:“原來是場噩夢啊……” “哼荷辕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起件豌,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤疮方,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后茧彤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骡显,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年曾掂,在試婚紗的時候發(fā)現(xiàn)自己被綠了惫谤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡珠洗,死狀恐怖石挂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情险污,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布富岳,位于F島的核電站蛔糯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏窖式。R本人自食惡果不足惜蚁飒,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萝喘。 院中可真熱鬧淮逻,春花似錦、人聲如沸阁簸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽启妹。三九已至筛严,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饶米,已是汗流浹背桨啃。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留檬输,地道東北人照瘾。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像丧慈,于是被迫代替她去往敵國和親析命。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

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

  • 轉(zhuǎn)載:http://www.reibang.com/p/e70bd6645d88前言 熟悉Objective-C語...
    guoshengboy閱讀 1,041評論 0 1
  • 協(xié)議定義了一個藍(lán)圖,規(guī)定了用來實現(xiàn)某一特定任務(wù)或者功能的方法碳却、屬性队秩,以及其他需要的東西。類昼浦、結(jié)構(gòu)體 或枚舉都可以遵...
    GY1994閱讀 1,393評論 0 0
  • 本章將會介紹 協(xié)議語法屬性要求方法要求(Method Requirements)Mutating 方法要求構(gòu)造器要...
    寒橋閱讀 419評論 0 3
  • 協(xié)議語法 實現(xiàn)協(xié)議 擁有父類的類在采納協(xié)議時馍资,應(yīng)該將父類名放在協(xié)議名之前,以逗號分隔: 協(xié)議的屬性要求 協(xié)議不指定...
    666真666閱讀 1,696評論 0 2
  • 協(xié)議 協(xié)議是一種表示類型的相通性的方法关噪,往往這些類型某些方面迥異鸟蟹。比如,一個Bee對象和一個Bird對象就在飛行方...
    小松樹先生閱讀 1,019評論 0 0