您的问题包含一个错误的前提,即
func doMoreCoolThings(awesome: Amazing) -> Amazing { ... }
相当于:
func doMoreCoolThings<T: Amazing>(awesome: T) -> T { ... }
这根本不是真的。假设我有这些符合要求的类型可以使用:
struct AmazingApple: Amazing {
func doAmazingStuff() { print("I'm an apple who talks!") }
}
struct AmazingBanana: Amazing {
func doAmazingStuff() { print("I'm a banana who talks!") }
}
看看第一段代码让我做什么:
func doMoreCoolThings(awesome: Amazing) -> Amazing {
return AmazingBanana()
}
let input = AmazingApple()
let result = doMoreCoolThings(awesome: input)
print("The input is of type \(type(of: input))")
print("The return is of type: \(type(of: result))")
参数类型和返回类型是不同的,尽管它们都是Amazing的子类型。
另一方面,看看当你尝试对泛型变体做同样的事情时会发生什么:
泛型用于表达类型之间的关系。
非通用代码表示:
“让doMoreCoolThings(awesome:) 成为一个函数,它接受一个类型为Awesome 子类型的值,并返回一个类型为Awesome 子类型的值。”
通用代码表示:
“让doMoreCoolThings(awesome:) 是一个函数,它接受一个类型是某个类型的子类型的某个值,称它为T,并返回一个该类型是T 子类型的值,其中T 本身是一个子类型Amazing。”
请注意,第二个引号表示参数和返回必须是同一类型的要求。仅仅让它们都是Amazing 的子类型是不够的。