泛型协议在函数中作为参数和返回值类型使用
泛型协议只能作为泛型的约束使用,不能直接作为函数参数或者返回值类型使用。
就是说,函数要使用泛型协议作为类型,只能转换一下: 在函数中添加一个泛型,让泛型协议作为这个泛型的约束,然后就可以使用了。如下:
protocol SupermanType {
associatedtype NAMETYPE
}
struct Superman<T>: SupermanType {
typealias NAMETYPE = T
}
func makeASuperMan<S: SupermanType>(type: S.Type) -> S {
Superman<S>.init() as! S
}
let superman = makeASuperMan(type: Superman<Int>.self)
在makeASuperMan函数中, S为泛型, SupermanType为泛型协议。SupermanType还只能作为泛型约束,不能作为参数类型。