阅读苹果的Swift编程语言指南,关于不透明类型,有一个我不理解的段落。该指南讨论了不透明类型和协议之间的区别,并指出您不能嵌套调用返回协议类型的调用。他们使用了这个代码片段,其中Shape是一个协议:
它接着说明:
另一个问题是这种方法的形状变换无法嵌套。翻转三角形的结果是 Shape 类型的值,protoFlip(:) 函数需要一个符合 Shape 协议的某种类型的参数。然而,协议类型的值不符合该协议;protoFlip(:) 返回的值不符合 Shape。这意味着像 protoFlip(protoFlip(smallTriange)) 这样应用多个变换的代码是无效的,因为翻转后的形状不是 protoFlip(_: ) 的有效参数。
然而,我编写了以下代码:
func protoFlip<T: Shape>(_ shape: T) -> Shape {
if shape is Square {
return shape
}
return FlippedShape(shape: shape)
}
它接着说明:
另一个问题是这种方法的形状变换无法嵌套。翻转三角形的结果是 Shape 类型的值,protoFlip(:) 函数需要一个符合 Shape 协议的某种类型的参数。然而,协议类型的值不符合该协议;protoFlip(:) 返回的值不符合 Shape。这意味着像 protoFlip(protoFlip(smallTriange)) 这样应用多个变换的代码是无效的,因为翻转后的形状不是 protoFlip(_: ) 的有效参数。
然而,我编写了以下代码:
import Foundation
protocol P {
associatedtype AT
}
struct C: P {
typealias AT = Int
}
func f<T: P>(_ t: T) -> T {
t
}
func g() {
f(f(C()))
}
g()
这个可以编译并运行...并且似乎允许我嵌套这些调用。
我理解错了什么吗?文档想要表达什么意思?