一個(gè)協(xié)議聲明為你的程序引入一個(gè)命名了的協(xié)議類型。協(xié)議聲明使用 protocol
關(guān)鍵詞來進(jìn)行聲明并有下面這樣的形式:
protocolprotocol name
:inherited protocols
{
protocol member declarations
}
協(xié)議的主體包含零或多個(gè)協(xié)議成員聲明,這些成員描述了任何采用該協(xié)議必須滿足的一致性要求。特別的,一個(gè)協(xié)議可以聲明必須實(shí)現(xiàn)某些屬性、方法、初始化程序及下標(biāo)腳本的一致性類型。協(xié)議也可以聲明專用種類的類型別名,叫做關(guān)聯(lián)類型,它可以指定協(xié)議的不同聲明之間的關(guān)系。協(xié)議成員聲明會(huì)在下面的詳情里進(jìn)行討論。
協(xié)議類型可以從很多其它協(xié)議那繼承。當(dāng)一個(gè)協(xié)議類型從其它協(xié)議那繼承的時(shí)候,來自其它協(xié)議的所有要求就集合了,而且從當(dāng)前協(xié)議繼承的任何類型必須符合所有的這些要求。對(duì)于如何使用協(xié)議繼承的例子,查看協(xié)議繼承
注意:
你也可以使用協(xié)議合成類型集合多個(gè)協(xié)議的一致性要求,詳情參見協(xié)議合成類型和協(xié)議合成
你可以通過采用在類型的擴(kuò)展聲明中的協(xié)議來為之前聲明的類型添加協(xié)議一致性。在擴(kuò)展中你必須實(shí)現(xiàn)所有采用協(xié)議的要求。如果該類型已經(jīng)實(shí)現(xiàn)了所有的要求,你可以讓這個(gè)擴(kuò)展聲明的主題留空。
默認(rèn)地,符合某一個(gè)協(xié)議的類型必須實(shí)現(xiàn)所有聲明在協(xié)議中的屬性、方法和下標(biāo)腳本。也就是說,你可以用optional
屬性標(biāo)注這些協(xié)議成員聲明以指定它們的一致性類型實(shí)現(xiàn)是可選的。optional
屬性僅僅可以用于使用objc
屬性標(biāo)記過的協(xié)議。這樣的結(jié)果就是僅僅類類型可以采用并符合包含可選成員要求的協(xié)議。更多關(guān)于如何使用optional
屬性的信息及如何訪問可選協(xié)議成員的指導(dǎo)——比如當(dāng)你不能肯定是否一致性的類型實(shí)現(xiàn)了它們——參見可選協(xié)議要求
為了限制協(xié)議的采用僅僅針對(duì)類類型,需要使用class_protocol
屬性標(biāo)記整個(gè)協(xié)議聲明。任意繼承自標(biāo)記有class_protocol
屬性協(xié)議的協(xié)議都可以智能地僅能被類類型采用。
注意:
如果協(xié)議已經(jīng)用object
屬性標(biāo)記了,class_protocol
屬性就隱性地應(yīng)用于該協(xié)議;沒有必要再明確地使用class_protocol
屬性來標(biāo)記該協(xié)議了。
協(xié)議是命名的類型,因此它們可以以另一個(gè)命名類型出現(xiàn)在你代碼的所有地方,就像協(xié)議類型里討論的那樣。然而你不能構(gòu)造一個(gè)協(xié)議的實(shí)例,因?yàn)閰f(xié)議實(shí)際上不提供它們指定的要求的實(shí)現(xiàn)。
你可以使用協(xié)議來聲明一個(gè)類的代理的方法或者應(yīng)該實(shí)現(xiàn)的結(jié)構(gòu),就像委托(代理)模式描述的那樣。
協(xié)議(Protocol)聲明語法
協(xié)議聲明 → 特性(Attributes)列表 可選 protocol 協(xié)議名 類型繼承子句 可選 協(xié)議主體
協(xié)議名 → 標(biāo)識(shí)符
協(xié)議主體 → { 協(xié)議成員聲明(Declarations)列表 可選 }
協(xié)議成員聲明 → 協(xié)議屬性聲明
協(xié)議成員聲明 → 協(xié)議方法聲明
協(xié)議成員聲明 → 協(xié)議構(gòu)造器聲明
協(xié)議成員聲明 → 協(xié)議附屬腳本聲明
協(xié)議成員聲明 → 協(xié)議關(guān)聯(lián)類型聲明
協(xié)議成員聲明(Declarations)列表 → 協(xié)議成員聲明 協(xié)議成員聲明(Declarations)列表 可選
協(xié)議聲明了一致性類型必須在協(xié)議聲明的主體里通過引入一個(gè)協(xié)議屬性聲明來實(shí)現(xiàn)一個(gè)屬性。協(xié)議屬性聲明有一種特殊的類型聲明形式:
var
property name
:type
{ get set }
同其它協(xié)議成員聲明一樣,這些屬性聲明僅僅針對(duì)符合該協(xié)議的類型聲明了getter
和setter
要求。結(jié)果就是你不需要在協(xié)議里它被聲明的地方實(shí)現(xiàn)getter
和setter
。
getter
和setter
要求可以通過一致性類型以各種方式滿足。如果屬性聲明包含get
和set
關(guān)鍵詞,一致性類型就可以用可讀寫(實(shí)現(xiàn)了getter
和setter
)的存儲(chǔ)型變量屬性或計(jì)算型屬性,但是屬性不能以常量屬性或只讀計(jì)算型屬性實(shí)現(xiàn)。如果屬性聲明僅僅包含get
關(guān)鍵詞的話,它可以作為任意類型的屬性被實(shí)現(xiàn)。比如說實(shí)現(xiàn)了協(xié)議的屬性要求的一致性類型,參見屬性要求
上一篇:Swift運(yùn)算符下一篇:Swift類型方法