Swift中的協(xié)議

協(xié)議(Protocol)

1、協(xié)議可以用來定義方法翰绊、屬性佩谷、下標的聲明旁壮,協(xié)議可以被枚舉、結構體谐檀、類遵守(多個協(xié)議之間用逗號隔開)

protocol Drawable {
    func draw()
    var x: Int { get set }
    var y: Int { get }
    subscript(index: Int) -> Int { get set }
}

2抡谐、協(xié)議中定義方法時不能有默認參數值

3、默認情況下桐猬,協(xié)議中定義的內容必須全部都實現(xiàn)

協(xié)議中的屬性

1麦撵、協(xié)議中定義屬性時必須用var關鍵字

2、實現(xiàn)協(xié)議時屬性權限要不小于協(xié)議中定義的屬性權限

    協(xié)議定義get溃肪、set免胃,用var存儲屬性或get、set計算屬性去實現(xiàn)

    協(xié)議定義get惫撰,用任何屬性都可以實現(xiàn)
class Person: Drawable {
    var x: Int = 0
    let y: Int = 0

    func draw() {
        print("Person draw")
    }

    subscript(index: Int) -> Int {
        set {}
        get { index }
    }
}
class Person: Drawable {
    var x: Int {
        get { 0 }
        set {}
    }
    var y: Int {
        get { 0 }
    }

    func draw() {
        print("Person draw")
    }

    subscript(index: Int) -> Int {
        set {}
        get { index }
    }
}

static羔沙、class

1、為了保證通用厨钻,協(xié)議中必須用static定義類型方法扼雏、類型屬性、類型下標

protocol Drawable {
    static func draw()
}

class Person1: Drawable {
    class func draw() {
        print("Person1 draw")
    }
}

class Person2: Drawable {
    static func draw() {
        print("Person2 draw")
    }
}

mutating

1夯膀、只有將協(xié)議中的實例方法標記為mutating

    才允許結構體诗充、枚舉的具體實現(xiàn)修改自身內存

    類在實現(xiàn)方法時不用加mutating,枚舉棍郎、結構體才需要加mutating
protocol Drawable {
    mutating func draw()
}

class Size: Drawable {
    var width: Int = 0
    func draw() {
        width = 10
    }
}

static Point: Drawable {
    var x: Int = 0
    mutating func draw() {
        x = 10
    }
}

init

1其障、協(xié)議里面還可以定義初始化器init

    非final類實現(xiàn)時必須加上required
protocol Drawable {
    init(x: Int, y: Int)
}

class Point: Drawable {
    required init(x: Int, y: Int) {

    }
}

final class Size: Drawable {
    init(x: Int, y: Int) {

    }
}

2、如果從協(xié)議實現(xiàn)的初始化器涂佃,剛好是重寫了父類的指定初始化器

    那么這個初始化必須同時加required励翼、override
protocol Liveable {
    init(age: Int)
}

class Person {
    init(age: Int) {}
}

class Student: Person, Liveable {
    required override init(age: Int) {
        super.init(age: age)
    }
}

init、init?辜荠、init!

1汽抚、協(xié)議中定義的init?、init!伯病,可以用init造烁、init?、init!去實現(xiàn)

2午笛、協(xié)議中定義的init惭蟋,可以用init、init!去實現(xiàn)

protocol Liveable {
    init()
    init?(age: Int)
    init!(no: Int)
}

class Person: Liveable {
    required init() {}
//    required init!() {}

    required init?(age: Int) {}
//    required init!(age: Int) {}
//    required init(age: Int) {}

    required init!(no: Int) {}
//    required init?(no: Int) {}
//    required init(no: Int) {}
}

協(xié)議的繼承

1药磺、一個協(xié)議可以繼承其他協(xié)議

協(xié)議組合

1告组、協(xié)議組合,可以包含1個類類型(最多1個)

protocol Livable {}
protocol Runnable {}
class Person {}

//接收Person或者其子類的實例
func fn0(obj: Person) {}

//接收遵守Livable協(xié)議的實例
func fn1(obj: Livable) {}

//接收同時遵守Livable和Runnable協(xié)議的實例
func fn2(obj: Livable & Runnable) {}

//接收同時遵守Livable癌佩、Runnable協(xié)議木缝,并且是Person或者其子類的實例
func fn3(obj: Person & Livable & Runnable) {}
typealias RealPerson = Person & Livable & Runnable
func fn4(obj: RealPerson) {}

CaseIterable

1便锨、讓枚舉遵守CaseIterable協(xié)議,可以實現(xiàn)遍歷枚舉值

enum Season: CaseIterable {
    case spring, summer, autumn, winter
}

let seasons = Season.allCases
print(seasons.count) // 4

for season in seasons {
    print(season)
}

CustomStringConvertible

1我碟、遵守CustomStringConvertible協(xié)議放案,可以自定義實例的打印字符串

class Person: CustomStringConvertible {
    var age: Int
    var name: String

    init(age: Int, name: String) {
        self.age = age
        self.name = name
    }

    var description: String {
        "age = \(age), name = \(name)"
    }
}

var p = Person(age: 10, name: "Jack")
print(p) // age = 10, name = Jack
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市矫俺,隨后出現(xiàn)的幾起案子吱殉,更是在濱河造成了極大的恐慌振乏,老刑警劉巖峡钓,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡催烘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門缎罢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伊群,“玉大人,你說我怎么就攤上這事策精〗⑹迹” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵咽袜,是天一觀的道長丸卷。 經常有香客問我,道長询刹,這世上最難降的妖魔是什么谜嫉? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮凹联,結果婚禮上沐兰,老公的妹妹穿的比我還像新娘。我一直安慰自己蔽挠,他們只是感情好住闯,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著澳淑,像睡著了一般比原。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杠巡,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天量窘,我揣著相機與錄音,去河邊找鬼忽孽。 笑死绑改,一個胖子當著我的面吹牛谢床,可吹牛的內容都是我干的。 我是一名探鬼主播厘线,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼识腿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了造壮?” 一聲冷哼從身側響起渡讼,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耳璧,沒想到半個月后成箫,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡旨枯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年蹬昌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攀隔。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡皂贩,死狀恐怖,靈堂內的尸體忽然破棺而出昆汹,到底是詐尸還是另有隱情明刷,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布满粗,位于F島的核電站辈末,受9級特大地震影響,放射性物質發(fā)生泄漏映皆。R本人自食惡果不足惜挤聘,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劫扒。 院中可真熱鬧檬洞,春花似錦、人聲如沸沟饥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贤旷。三九已至广料,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間幼驶,已是汗流浹背艾杏。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盅藻,地道東北人购桑。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓畅铭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親勃蜘。 傳聞我的和親對象是個殘疾皇子硕噩,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容

  • 協(xié)議 協(xié)議的特點1. 協(xié)議可以定義方法阳惹、屬性谍失、下標的聲明,協(xié)議可以被枚舉莹汤、結構體快鱼、類遵守(多個協(xié)議用逗號分割)2....
    a_只羊閱讀 648評論 0 1
  • 定義: 協(xié)議定義了一個藍圖,規(guī)定了用來實現(xiàn)某一特定的任務或者功能的方法体啰、屬性攒巍,或其他需要的東西。類荒勇、結構體、枚舉都...
    geekLiu閱讀 1,433評論 0 1
  • 協(xié)議的語法 自定義類型聲明時闻坚,將協(xié)議名放在類型名的冒號之后來表示該類型采納一個特定的協(xié)議沽翔。多個協(xié)議可以用逗號分開列...
    一個栗閱讀 731評論 1 11
  • 協(xié)議(Protocol) 1)協(xié)議可以用來定義方法、屬性窿凤、下標的聲明仅偎,協(xié)議可以被枚舉、結構體雳殊、類遵守(多個協(xié)議之間...
    codeTao閱讀 257評論 0 1
  • 1.協(xié)議介紹 協(xié)議可以用來定義方法橘沥、屬性、下標的聲明夯秃,協(xié)議可以被枚舉座咆、結構體、類遵守(多個協(xié)議之間用逗號隔開) 協(xié)...
    happy神悅閱讀 231評論 0 1