Swift 3必看:typealias支持泛型
2016-09-10 本文已影响2181人
没故事的卓同学
一个很有用的新特性,可以在别名添加泛型。例子如下:
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方法来求周长。