Swift協(xié)議 徹底發(fā)倔

1.swift協(xié)議的應(yīng)用環(huán)境

? ? ? ?在Swift中蘋果技術(shù)團(tuán)隊(duì)將protocol這種語(yǔ)法發(fā)揮的更加深入和徹底。Swift中的protocol不僅能定義方法還能定義屬性,配合extension擴(kuò)展的使用還能提供一些方法的默認(rèn)實(shí)現(xiàn),而且不僅類可以遵循協(xié)議,現(xiàn)在的枚舉和結(jié)構(gòu)體也能遵循協(xié)議了。希望能給Swift開(kāi)發(fā)的小伙伴們了解的更透徹。

2.協(xié)議的定義

? ? (官方文檔)指出,協(xié)議為方法、屬性、以及其他特定的任務(wù)需求或功能定義藍(lán)圖。協(xié)議可被類、結(jié)構(gòu)體、或枚舉類型采納以提供所需功能的具體實(shí)現(xiàn)。滿足了協(xié)議中需求的任意類型都叫做遵循了該協(xié)議

協(xié)議中定義屬性

protocol?Student?{

//可讀可寫的屬性

varname:?String?{?get?set?}

//可讀屬性

varbirthPlace:?String?{?get?}

}.

struct?Puple:?Student?{

var name:?String

var birthPlace:?String?="北京"

}

var p1?=?Puple(name:"小明",?birthPlace:"上海")//實(shí)例中的屬性同樣可以被修改.但會(huì)不會(huì)有疑問(wèn)?明明是只讀的屬性,為什么能修改了。 ?注意 ? ?協(xié)議中的“只讀”屬性修飾的是協(xié)議這種“類型“”的實(shí)例 如果還不理解就創(chuàng)建個(gè)對(duì)象比對(duì)就可以領(lǐng)會(huì)。


協(xié)議中定義方法

protocol?Student?{

//類方法static?func?study()//實(shí)例方法func?changeName()}

struct?CollageStudent:?Student?{

//類方法實(shí)現(xiàn)

static?func?study()?{}//實(shí)例方法實(shí)現(xiàn)

func?changeName()?{}}

//方法的調(diào)用

CollageStudent.study()

var c1?=?CollageStudent() ?c1.changeName()

注意:當(dāng)我們?cè)诮Y(jié)構(gòu)體中的方法修改到屬性的時(shí)候需要在方法前面加上關(guān)鍵字mutating表示該屬性能夠被修改。而name屬性也可讀可寫,不然也就沒(méi)意義了不是。


協(xié)議中的初始化器

protocol?Pet?{

init(name:?String)

}

class?Cat:?Pet?{

varname:?String?="Cat"

required?init(name:?String)?{

self.name?=?name

}}//Cat由于遵循了Pet協(xié)議,應(yīng)該用required關(guān)鍵字修飾初始化器的具體實(shí)現(xiàn)

注意:Swift中類的繼承是單一的,但是類可以遵守多個(gè)協(xié)議,因此為了突出其單一父類的特殊性,我們應(yīng)該將繼承的父類放在最前面,將遵守的協(xié)議依次放在后面。


.多個(gè)協(xié)議重名方法調(diào)用沖突(解決呀)

protocol?TextOne?{func?text()?->?Int}

protocol?TextTwo?{func?text()?->?String}

同時(shí)繼承這倆個(gè)類

struct?Person:?TextOne,?TextTwo?{

func?text()?->?Int?{return10}

func?text()?->?String?{return"hello"}}

let?p1?=?Person()

//嘗試調(diào)用返回值為Int的方法

let?num?=?p1.text()

//嘗試調(diào)用返回值為String的方法

let?string?=?p1.text()

調(diào)用一定是無(wú)法通過(guò)的,怎么解決,當(dāng)然一般也不會(huì)這樣設(shè)計(jì),但腦子發(fā)熱就要這樣寫怎么辦,已解決:

//嘗試調(diào)用返回值為Int的方法

let?num?=?(p1?as?TextOne).text()

//嘗試調(diào)用返回值為String的方法

let?string?=?(p1?as?TextTwo).text()

協(xié)議的繼承、聚合、關(guān)聯(lián)類型

協(xié)議可以繼承一個(gè)或者多個(gè)其他協(xié)議并且可以在它繼承的基礎(chǔ)之上添加更多要求。協(xié)議繼承的語(yǔ)法與類繼承的語(yǔ)法相似,選擇列出多個(gè)繼承的協(xié)議,使用逗號(hào)分隔

協(xié)議的聚合(這種模式小編較少使用,一方面不多見(jiàn),另一方面代碼過(guò)于復(fù)雜不便于開(kāi)發(fā)設(shè)計(jì)也不推薦,看似高大上小編認(rèn)為不夠友好)這方面的設(shè)計(jì)swift是支持的??梢宰孕蟹?。

//協(xié)議聚合成臨時(shí)的類型

typealias?Three?=?TwoProtocol?&?OneProtocol

//協(xié)議聚合成為參數(shù)的類型

func?text(paramter:?OneProtocol?&?TwoProtocol)?{

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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