Swift 3必看:typealias支援泛型

沒故事的卓同學發表於2016-09-10

一個很有用的新特性,可以在別名新增泛型。例子如下:

typealias StringDictionary<T> = Dictionary<String, T>
typealias DictionaryOfStrings<T : Hashable> = Dictionary<T, String>
typealias IntFunction<T> = (T) -> Int
typealias Vec3<T> = (T, T, T)複製程式碼

別名的使用會更加靈活。 如例子所展示,可以宣告一個key為字串的型別,或者值為字串的型別。

//一個key為String,value為T的字典
typealias StringDictionary<T> = Dictionary<String, T>

//一個value為String的字典
typealias DictionaryOfStrings<T : Hashable> = Dictionary<T, String>

let keyIsStringDict: StringDictionary<Int> = ["key":6]
let valueIsStringDict: DictionaryOfStrings<Int> = [5:"value"]

//當然也可以使用在函式引數裡
func joinKey<T: Equatable>(dict: StringDictionary<T>) -> String {
    return dict.map {
        return $0.key
    }.reduce("")  { (result, key) -> String in
        return "\(result) \(key)"
    }
}

let testDict = ["first":6, "second":6, "third":6]
let joinedKey = joinKey(dict: testDict)

//結果為" second third first"複製程式碼

在指定閉包型別的時候也很有用:

typealias IntFunction<T> = (T) -> Int複製程式碼

上面的例子就定義了一個引數型別為T,返回值為Int的閉包。

在指定tuple時也很有用,比如:

typealias Vec3<T> = (T, T, T)

func perimeter(data: Vec3<Int>) -> Int {
    return data.0 + data.1 + data.2
}

let triangle = (1,2,3)
let result = perimeter(data: triangle)

//result 為 6複製程式碼

宣告瞭一個有三個元素並且元素型別都一致的tuple,例子中用來表示一個三角形,寫了一個perimeter方法來求周長。

相關連結: SE048-Generic Type Aliases

相關文章