- 跟戴銘學iOS編程:理順核心知識點
- 戴銘
- 496字
- 2024-01-19 15:19:45
1.2.1 類型約束
HTN項目里狀態機的Transition結構體的定義,如下所示。
struct HTNTransition<S: Hashable, E: Hashable> { let event: E let fromState: S let toState: S init(event: E, fromState: S, toState: S) { self.event = event self.fromState = fromState self.toState = toState if fromState == toState { print("Two state is same") } } }
以上示例中的event、fromState和toState可以是不同類型的數據,也可以是枚舉、字符串或者整數等。定義S和E兩個不同的泛型可以讓狀態和事件的類型不同,這樣接口會更加靈活,更容易適配更多的項目。
大家可以注意到S和E都遵循Hashable協議,這就是要求它們要符合這個協議的類型約束。使用協議可以使這兩個泛型更加規范和易于擴展。
在Swift中,String、Int、Double、Bool,以及無關聯值的枚舉等都是遵循Hashable協議的。Hashable協議提供的hashValue方法用于判斷協議對象是否相等。
Hashable協議同時也是繼承Equatable協議的,遵循了Hashable協議的類或結構通過實現Equatable協議確定自定義的類或結構是否相同。在遵循了Equatable協議后,協議里的函數就可以對遵循了這個協議的參數進行是否相等的比較了。Swift的內置類型都支持Equatable協議,比如String、Int和Float等都支持==或!=運算。注意,自定義的類型如果沒有遵循Equatable協議是沒法使用==運算或者使用與這個運算相關的方法的,比如數組里的contain等。自定義類型一旦實現了Equatable協議也就意味著能夠使用系統集合里的API進行查找,通過重載>、<、>=和<=等,還能夠對自定義的類型在集合里進行排序。
推薦閱讀
- Learning Single:page Web Application Development
- Python概率統計
- Mastering Entity Framework Core 2.0
- ASP.NET Core 5.0開發入門與實戰
- 騰訊iOS測試實踐
- 深入淺出Java虛擬機:JVM原理與實戰
- Java Web開發之道
- Instant QlikView 11 Application Development
- 從零開始學C#
- Node.js 12實戰
- 交互式程序設計(第2版)
- 遠方:兩位持續創業者的點滴思考
- Mastering Concurrency in Python
- Penetration Testing with the Bash shell
- Clojure High Performance Programming(Second Edition)