Swift 3必看:typealias支持泛型

1,314 阅读1分钟

一个很有用的新特性,可以在别名添加泛型。例子如下:

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