1.協議
-
協議的語法:
-
定義協議
-
遵守協議:在型別名稱後面,加上協議名稱,用
:
隔開,協議之間用,
隔開 -
繼承父類的子類的時候,應該把父類寫在協議前面,
protocol SomeProtocol {} class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol {} 複製程式碼
-
屬性要求
-
協議中定義了屬性,遵守該協議的例項或型別,必須有這個屬性
-
協議的中定義屬性,只指定屬性的名稱和型別,還指定屬性的可讀性,可寫性,
-
方法要求
-
和普通方法一樣,但不需要{} 和方法體,方法的引數列表也不支援預設值
-
Mutating 方法要求
-
如果你在協議中定義了一個例項方法,該方法會改變遵循該協議的型別的例項,那麼在定義協議時需要在方法前加 mutating 關鍵字。這使得結構體和列舉能夠遵循此協議並滿足此方法要求。
-
構造器要求
-
協議可以要求遵循協議的型別實現指定的構造器。你可以像編寫普通構造器那樣,在協議的定義裡寫下構造器的宣告,但不需要寫花括號和構造器的實體
-
實現的時候,遵守代理的構造器方法需要加上關鍵字
required
-
如果一個類是定義了
final
,不需要在寫required,因為不會有子類,final是為了防止重寫 -
如果子類重寫了父類的指定構造器,並且指定構造器遵循了某個協議,該方法同時需要寫關鍵字
required
和overri
-
協議作為型別
class Dice { let sides: Int let generator: RandomNumberGenerator init(sides: Int, generator: RandomNumberGenerator) { self.sides = sides self.generator = generator } func roll() -> Int { return Int(generator.random() * Double(sides)) + 1 } } 複製程式碼
-
Dice 類提供了一個名為 roll 的例項方法,用來模擬骰子的面值。它先呼叫 generator 的 random() 方法來生成一個 [0.0,1.0) 區間內的隨機數,然後使用這個隨機數生成正確的骰子面值。因為 generator 遵循了 RandomNumberGenerator 協議,可以確保它有個 random() 方法可供呼叫
2.委託(代理)模式
-
protocol - delegate
3.通過擴充套件新增協議一致性,通過擴充套件遵循協議
- 當一個型別已經符合了某個協議中的所有要求,卻還沒有宣告遵循該協議時,可以通過空擴充套件體的擴充套件來遵循該協議:
4.協議型別的集合,協議的繼承
-
協議能夠繼承一個或多個其他協議,可以在繼承的協議的基礎上增加新的要求
-
例子中定義了一個新的協議 PrettyTextRepresentable,它繼承自 TextRepresentable 協議。任何遵循 PrettyTextRepresentable 協議的型別在滿足該協議的要求時,也必須滿足 TextRepresentable 協議的要求
5.類型別專屬協議
-
只適用一某種型別
6.協議合成
-
有時候需要同時遵循多個協議,你可以將多個協議採用 SomeProtocol & AnotherProtocol 這樣的格式進行組合,稱為 協議合成(protocol composition)。你可以羅列任意多個你想要遵循的協議,以與符號(&)分隔。
7.檢查協議一致性
-
Circle,Country,遵守了HasArea協議,協議中有隻讀的area屬性
-
Animal 沒有遵守HasArea協議
-
上面三個各自例項,判斷是不是符合某個協議的,使用
as?
, 返回可選值,進行可選值繫結
8.可選的協議要求
- 可選的時候使用
optional
關鍵字 - 可選要求用在你需要和 Objective-C 打交道的程式碼中。協議和可選要求都必須帶上@objc屬性
@objc protocol CounterDataSource { optional func incrementForCount(count: Int) -> Int optional var fixedIncrement: Int { get } } 複製程式碼
8.協議擴充套件
-
協議可以通過擴充套件來為遵循協議的型別提供屬性、方法以及下標的實現。通過這種方式,你可以基於協議本身來實現這些功能,而無需在每個遵循協議的型別中都重複同樣的實現,也無需使用全域性函式
-
擴充套件
RandomNumberGenerator
協議,增加randomBool()
方法extension RandomNumberGenerator { func randomBool() -> Bool { return random() > 0.5 } } 複製程式碼
-
提供預設實現
-
為協議擴充套件新增限制條件
-
在擴充套件協議的時候,可以指定一些限制條件,只有遵循協議的型別滿足這些限制條件時,才能獲得協議擴充套件提供的預設實現。這些限制條件寫在協議名之後,使用 where 子句來描述
-
textualDescription返回整個集合的文字描述,講文字描述用,拼接起來,包括在【】中
-
Hamster 結構體符合TextRepresentable協議,放在一個陣列中,array 符合CollectionType協議,
-
可以進行textualDescription方法,
-
如果多個協議擴充套件都為同一個協議要求提供了預設實現,而遵循協議的型別又同時滿足這些協議擴充套件的限制條件,那麼將會使用限制條件最多的那個協議擴充套件提供的預設實現