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