swift文件筆記(十七) -- 協議
協議就是協議裡的屬性方法,在遵循協議的類·結構體·列舉中,必須要有實現。
1.協議語法
protocol SomeProtocol {
//
這裡是協議的定義部分
var mustBeSettable: Int { get set }//讀寫
var doesNotNeedToBeSettable: Int { get }//只讀,但實際實現中可以是讀寫
}
2.構造器要求
你可以在遵循協議的類中實現構造器,無論是作為指定構造器,還是作為便利構造器,你都必須為構造器實現標上 required 修飾符。
3.擴充套件和協議
通過擴充套件新增協議一致性 (擴充套件型別,
extension Dice: TextRepresentable {
var textualDescription: String {
return "A \(sides)-sided dice"
}
}
通過擴充套件遵循協議 (本來不遵循協議的,變成遵循協議)
extension Dice: TextRepresentable {
}
協議可以通過擴充套件來為遵循協議的型別提供屬性、方法以及下標的實現。(擴充套件協議)
//基於協議本身來實現這些功能,而無需在每個遵循協議的型別中都重複同樣的實現,也無需使用全域性函式。
//為協議擴充套件新增限制條件,用 where 子句來描述,只適用於集合中的元素遵循了TextRepresentable協議的情況。
extension RandomNumberGenerator where Generator.Element: TextRepresentable {
func randomBool() -> Bool {
return random() > 0.5
}
}
4.協議的繼承
協議能夠繼承一個或多個其他協議,可以在繼承的協議的基礎上增加新的要求。
你可以在協議的繼承列表中,通過新增 class
protocol InheritingProtocol: class, SomeProtocol, AnotherProtocol {
// 這裡是協議的定義部分
}
5.可選的協議要求
可選要求用在你需要和 Objective-C 打交道的程式碼中。
協議和可選要求都必須帶上 @objc 屬性。標記 @objc 特性的協議只能被繼承自 Objective-C 類的類或者 @objc 類遵循,其他類以及結構體和列舉均不能遵循這種協議。
@objc protocol CounterDataSource {
optional func incrementForCount(count: Int) -> Int
optional var fixedIncrement: Int { get }
}