Skip to content

Commit ae53cda

Browse files
committed
「符合」->「遵循」某协议
1 parent 14136f0 commit ae53cda

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

swift-6-beta.docc/LanguageGuide/OpaqueTypes.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
Swift 提供了两种隐藏值类型细节的方法:不透明类型(Opaque Type)和封装协议类型(Boxed Protocol Type)。在隔离模块和调用模块的代码上,隐藏类型信息是有用的,因为这样返回值的底层类型可以保持私有。
66

7-
返回不透明类型的函数或方法隐藏了其返回值的类型信息。函数会将返回值类型描述为一个符合某种协议的类型,而非一个更具体的类型。不透明类型会保留类型的身份信息 —— 编译器可以访问该类型信息,但模块的调用端则无法访问。
7+
返回不透明类型的函数或方法隐藏了其返回值的类型信息。函数会将返回值类型描述为一个遵循某种协议的类型,而非一个更具体的类型。不透明类型会保留类型的身份信息 —— 编译器可以访问该类型信息,但模块的调用端则无法访问。
88

99
封装协议类型可以存储遵循给定协议的任何类型的实例。封装协议类型不保留类型的身份信息 —— 值的具体类型在运行时才会被知道,并且随着不同的值被存储其中,它的具体类型可能会发生变化。
1010

@@ -566,7 +566,7 @@ protoFlippedTriangle == sameThing // 错误
566566

567567
将封装协议类型用作函数的返回类型,给你带来了返回任何遵循该协议的类型的灵活性。然而,这种灵活性的代价是,某些操作无法在返回的值上执行。上面的示例显示了 `==` 运算符不可用的情况 —— 它依赖于特定的类型信息,而使用封装协议类型时这些信息无法保留。
568568

569-
这种方法的另一个问题是形状变换无法嵌套。翻转三角形的结果是一个类型为 `Shape` 的值,而 `protoFlip(_:)` 函数的参数是某种遵循 `Shape` 协议的类型。然而,封装协议类型的值并不遵循该协议。因此,`protoFlip(_:)` 返回的值并不遵循 `Shape` 协议。这意味着像 `protoFlip(protoFlip(smallTriangle))` 这样试图嵌套多次变换的代码是不合法的,因为翻转后的形状不是 `protoFlip(_:)` 的合法参数。(译者注:在此例中,封装协议类型的函数返回值允许该返回值是任何符合 `Shape` 协议的类型,但这个封装本身并不保留原始类型的信息,即“存在某种遵循 `Shape` 协议的类型,但具体是什么类型你不知道”。这种类型信息在被封装后是被抹除的。因此,虽然 `any Shape` 可以持有一个遵循 `Shape` 协议的值,但 `any Shape` 本身并不遵循 `Shape` 协议。)
569+
这种方法的另一个问题是形状变换无法嵌套。翻转三角形的结果是一个类型为 `Shape` 的值,而 `protoFlip(_:)` 函数的参数是某种遵循 `Shape` 协议的类型。然而,封装协议类型的值并不遵循该协议。因此,`protoFlip(_:)` 返回的值并不遵循 `Shape` 协议。这意味着像 `protoFlip(protoFlip(smallTriangle))` 这样试图嵌套多次变换的代码是不合法的,因为翻转后的形状不是 `protoFlip(_:)` 的合法参数。(译者注:在此例中,封装协议类型的函数返回值允许该返回值是任何遵循 `Shape` 协议的类型,但这个封装本身并不保留原始类型的信息,即“存在某种遵循 `Shape` 协议的类型,但具体是什么类型你不知道”。这种类型信息在被封装后是被抹除的。因此,虽然 `any Shape` 可以持有一个遵循 `Shape` 协议的值,但 `any Shape` 本身并不遵循 `Shape` 协议。)
570570

571571
相比之下,不透明类型保留了底层类型的身份信息。Swift 可以推断出关联的类型,这使得你可以在封装协议类型不能用作返回值的地方使用不透明返回值。例如,下面是一个来自<doc:Generics>`Container` 协议的版本:
572572

0 commit comments

Comments
 (0)