官术网_书友最值得收藏!

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進行查找,通過重載>、<、>=和<=等,還能夠對自定義的類型在集合里進行排序。

主站蜘蛛池模板: 衡山县| 林州市| 平昌县| 会东县| 金溪县| 惠东县| 武威市| 南华县| 丰都县| 扬中市| 额济纳旗| 抚州市| 西乌珠穆沁旗| 万宁市| 太仓市| 拉孜县| 凯里市| 高州市| 南漳县| 汝阳县| 黄平县| 东源县| 阳信县| 兴义市| 吉隆县| 抚顺市| 西昌市| 郎溪县| 江都市| 花莲县| 凤庆县| 望奎县| 宁阳县| 麻江县| 越西县| 进贤县| 民县| 河东区| 宝坻区| 大石桥市| 阿荣旗|