Swift---22.協(xié)議

  • 協(xié)議:

規(guī)定了用來實現(xiàn)某一特定任務(wù)或者功能的方法、屬性小槐,以及其他需要的東西.
- #####寫法:
使用protocol關(guān)鍵字表明這是一個協(xié)議,在要遵守協(xié)議的類名后使用":協(xié)議名"來遵循協(xié)議,擁有父類的類型,父類放在最前面,用,隔開
protocol SomeProtocol { //協(xié)議定義 } class SomeClass { //類定義 } class SomeSubClass:SomeClass,SomeProtocol { //類定義 }
- 遵循了一個協(xié)議,就需要實現(xiàn)協(xié)議中的屬性,方法,構(gòu)造器
- ######協(xié)議屬性:
Swift協(xié)議內(nèi),屬性不確定是存儲屬性還是計算屬性,只提供名稱和類型,具體實現(xiàn)由其遵循的類來定義.同時,必須標(biāo)明它是可讀寫,還是只讀,通過{set get}標(biāo)明可讀寫,通過{get}表示只讀,同理,使用static,class表明屬性為類屬性
```
protocol SomeProtocol {
var anotherName:String{get}
static func getStr(a:String) ->String
}
class Person: SomeProtocol {
var anotherName: String {
return "name"
}
static var name :String {
return "name"
}
}

    Person.name
    var some = Person()
    some.anotherName
    ```
    - ######協(xié)議方法:

Swift協(xié)議內(nèi),不寫方法的具體實現(xiàn),只定義方法名稱,方法參數(shù)類型,返回類型,具體實現(xiàn)由其遵循的類來定義.同理,使用static,class表明方法為類方法
protocol SomeProtocol { func getName()->String static func getStr(a:String) ->String } class Person: SomeProtocol { func getName() -> String { return "name" } static func getStr(a: String) -> String { return a+"!" } } Person.getStr(a: "aaa") var person = Person() person.getName()
- ######協(xié)議構(gòu)造器:
Swift協(xié)議內(nèi),不寫構(gòu)造器的具體實現(xiàn),只提供構(gòu)造器參數(shù),具體實現(xiàn)由其遵循的類來定義.
實現(xiàn)協(xié)議構(gòu)造器時,需要使用required關(guān)鍵字來修飾,同時,添加了required關(guān)鍵字,就表示了該類的子類也擁有該構(gòu)造器.
如果一個類的協(xié)議構(gòu)造器跟父類的構(gòu)造器相同,則必須同時加上required以及override關(guān)鍵字
protocol SomeProtocol { init(name:String) } class Person { var name:String init(name: String) { self.name = name } } class AnotherPerson:Person,SomeProtocol { required override init(name: String) { super.init(name: name) } } var person = AnotherPerson(name: "Allen") person.name
- ######協(xié)議作為類型
Swift中,協(xié)議可以作為參數(shù),返回值,也可以作為屬性類型,也可以作為Collection類型的元素類型
protocol SomeProtocol { init(name:String) } class Person { var name:String var someClass:SomeProtocol init(name: String,someClass:SomeProtocol) { self.name = name self.someClass = someClass } func getSomeClass()->(SomeProtocol) { return self.someClass } } class AnotherPerson:SomeProtocol{ required init(name: String) { print(name) } } var person = Person(name: "name", someClass: AnotherPerson(name: "protocol")) var someClass = person.getSomeClass() var array = [someClass]
- #####代理:
代理模式,一個類,委托某部分功能由代理實現(xiàn).可以用來響應(yīng)特定的動作蛙紫,或者接收外部數(shù)據(jù)源提供的數(shù)據(jù)拍屑,而無需關(guān)心外部數(shù)據(jù)源的類型。
protocol SomeProtocol { func negative() func zero() func positive() } class Person { var someClass:SomeProtocol? func judgeInt(numbers:[Int]) { for number in numbers { switch number { case 0: someClass?.zero() case let number where number < 0: someClass?.negative() default: someClass?.positive() } } } } class AnotherPerson:SomeProtocol{ func negative() { print("-") } func zero() { print("0") } func positive() { print("+") } } var person = Person() person.judgeInt(numbers: [-1,0,11]) person.someClass = AnotherPerson() person.judgeInt(numbers: [-1,0,11,22,11])
- ######通過擴展使類滿足協(xié)議
protocol SomeProtocol { subscript(index:Int)->Int { get } } extension Int:SomeProtocol { subscript(time:Int)->Int { return self*time } } 3[3]
- ######協(xié)議可以被另一個協(xié)議繼承,這時遵循改子類協(xié)議的對象,必須同時實現(xiàn)子協(xié)議與父協(xié)議的方法
protocol SomeProtocol { subscript(index:Int)->Int { get } } protocol SubProtocol:SomeProtocol { subscript(index:String)->String { get } } extension Int:SubProtocol { internal subscript(index: String) -> String { return index + String(self) } subscript(time:Int)->Int { return self*time } } 3[3] 3["3"]
- ######類專屬協(xié)議:
Swift中,可以通過在協(xié)議后添加:class來表明這個協(xié)議只能被類類型遵從,如果該協(xié)議有繼承的父協(xié)議,使用,隔開,寫在class后
protocol SomeProtocol { } protocol SubProtocol:class,SomeProtocol { } extension Int:SubProtocol { }
- ######合并協(xié)議:
在某些特定環(huán)境中,例如方法參數(shù)類型,我們有時候需要把多個協(xié)議要求合成,這是如果使用","號會報錯,同時,如果使用(,)會將其變?yōu)樵M,Swift中提供了&符號來合并協(xié)議.合并協(xié)議并不會生成新的協(xié)議,它只作用在某個特定的區(qū)域內(nèi)
protocol SomeProtocol:class { } protocol AnotherProtocol:class { } func composition(class:SomeProtocol&AnotherProtocol){ }
- #####檢查是否符合協(xié)議,使用"is","as?","as!"來判斷,
- ######is:
用來檢查實例是否符合某個協(xié)議坑傅,若符合則返回 true僵驰,否則返回 false。
- ######as?:
返回一個可選值唁毒,當(dāng)實例符合某個協(xié)議時蒜茴,返回類型為協(xié)議類型的可選值,否則返回 nil浆西。
- ######as!:
將實例強制向下轉(zhuǎn)換到某個協(xié)議類型粉私,如果強轉(zhuǎn)失敗,會引發(fā)運行時錯誤
protocol SomeProtocol { } extension Int:SomeProtocol { } var array:[Any] = ["str",1] for item in array { if let object = item as? SomeProtocol { print("\(object)符合協(xié)議") }else { print("\(item)不符合協(xié)議") } }
- #####可選協(xié)議要求:
上面介紹的,不管是在協(xié)議中定義屬性,方法,構(gòu)造器,都是方法必須實現(xiàn)的.Swift中,我們可以定義協(xié)議中的某個要求為可選要求.在協(xié)議中使用optional作為前綴來定義可選要求.可選要求只能被Objective-C類或者@Objc的類遵循,所以必須在協(xié)議和要求前寫上@objc
@objc protocol Name { @objc optional func printName() func printAnotherName() } //報錯,因為String不是objc類型 //extension String:Name { // //} extension NSString:Name { func printAnotherName() { print("name") } }
- #####擴展協(xié)議:
協(xié)議可以通過擴展來為遵循協(xié)議的類型提供屬性室谚、方法以及下標(biāo)的實現(xiàn).實現(xiàn)后,每個遵循協(xié)議的類不需要再定義擴展中實現(xiàn)的某個要求
protocol Name { func printAnotherName() } extension Name { func printAnotherName() { print("name") } } class SomeClass:Name { } SomeClass().printAnotherName()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末毡鉴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子秒赤,更是在濱河造成了極大的恐慌猪瞬,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件入篮,死亡現(xiàn)場離奇詭異陈瘦,居然都是意外死亡,警方通過查閱死者的電腦和手機潮售,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門痊项,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锅风,“玉大人,你說我怎么就攤上這事鞍泉≈宀海” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵咖驮,是天一觀的道長边器。 經(jīng)常有香客問我,道長托修,這世上最難降的妖魔是什么忘巧? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮睦刃,結(jié)果婚禮上砚嘴,老公的妹妹穿的比我還像新娘。我一直安慰自己涩拙,他們只是感情好际长,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吃环,像睡著了一般也颤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上郁轻,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音文留,去河邊找鬼好唯。 笑死,一個胖子當(dāng)著我的面吹牛燥翅,可吹牛的內(nèi)容都是我干的骑篙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼森书,長吁一口氣:“原來是場噩夢啊……” “哼靶端!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凛膏,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤杨名,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后猖毫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體台谍,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年吁断,在試婚紗的時候發(fā)現(xiàn)自己被綠了趁蕊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坞生。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掷伙,靈堂內(nèi)的尸體忽然破棺而出是己,到底是詐尸還是另有隱情,我是刑警寧澤任柜,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布赃泡,位于F島的核電站,受9級特大地震影響乘盼,放射性物質(zhì)發(fā)生泄漏升熊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一绸栅、第九天 我趴在偏房一處隱蔽的房頂上張望级野。 院中可真熱鬧,春花似錦粹胯、人聲如沸蓖柔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽况鸣。三九已至,卻和暖如春竹观,著一層夾襖步出監(jiān)牢的瞬間镐捧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工臭增, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留懂酱,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓誊抛,卻偏偏與公主長得像列牺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拗窃,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

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