|
1 | 1 | # 不透明类型和封装协议类型
|
2 | 2 |
|
3 |
| -隐藏关于值类型的实现细节。 |
| 3 | +隐藏值类型的实现细节。 |
4 | 4 |
|
5 |
| -Swift 提供了两种隐藏值类型细节的方法:不透明类型(Opaque Type)和封装协议类型(Boxed Protocol Type)。在模块与模块调用端之间的边界上隐藏类型信息是有用的,因为这样返回值的底层类型可以保持为私有的可访问状态。 |
| 5 | +Swift 提供了两种隐藏值类型细节的方法:不透明类型(Opaque Type)和封装协议类型(Boxed Protocol Type)。在隔离模块和调用模块的代码上,隐藏类型信息是有用的,因为这样返回值的底层类型可以保持私有。 |
6 | 6 |
|
7 |
| -返回不透明类型的函数或方法隐藏了其返回值的类型信息。相较于提供一个具体的类型作为函数的返回类型,它会根据它支持的协议来描述它的返回值。不透明类型会保留类型的身份信息 —— 编译器可以访问该类型信息,但模块的调用端则无法访问。 |
| 7 | +返回不透明类型的函数或方法隐藏了其返回值的类型信息。函数会将返回值类型描述为一个符合某种协议的类型,而非一个更具体的类型。不透明类型会保留类型的身份信息 —— 编译器可以访问该类型信息,但模块的调用端则无法访问。 |
8 | 8 |
|
9 | 9 | 封装协议类型可以存储遵循给定协议的任何类型的实例。封装协议类型不保留类型的身份信息 —— 值的具体类型在运行时才会被知道,并且随着不同的值被存储其中,它的具体类型可能会发生变化。
|
10 | 10 |
|
@@ -60,7 +60,7 @@ print(smallTriangle.draw())
|
60 | 60 | ```
|
61 | 61 | -->
|
62 | 62 |
|
63 |
| -如下面的代码所示,你可以使用泛型来实现像垂直翻转某个几何转形状这样的操作。然而,这种方法有一个重要的局限性:翻转后的结果会暴露用于创建该结果的确切的泛型类型。 |
| 63 | +如下面的代码所示,你可以使用泛型来实现像垂直翻转某个几何形状这样的操作。然而,这种方法有一个重要的局限性:翻转后的结果会暴露用于创建该结果的确切的泛型类型。 |
64 | 64 |
|
65 | 65 | ```swift
|
66 | 66 | struct FlippedShape<T: Shape>: Shape {
|
@@ -96,7 +96,7 @@ print(flippedTriangle.draw())
|
96 | 96 | ```
|
97 | 97 | -->
|
98 | 98 |
|
99 |
| -又比如下面这样的代码,这种方法定义了一个 `JoinedShape<T: Shape, U: Shape>` 结构体将两个形状垂直连接在一起,如果把一个三角形与一个翻转过的三角形连接在一起,就产生了像 `JoinedShape<Triangle, FlippedShape<Triangle>>` 这样的类型。 |
| 99 | +又比如下面这样的代码,这种方法定义了一个能将两个形状垂直连接起来的 `JoinedShape<T: Shape, U: Shape>` 结构体,如果把一个三角形与一个翻转过的三角形连接在一起,就产生了像 `JoinedShape<Triangle, FlippedShape<Triangle>>` 这样的类型。 |
100 | 100 |
|
101 | 101 | ```swift
|
102 | 102 | struct JoinedShape<T: Shape, U: Shape>: Shape {
|
@@ -139,7 +139,7 @@ print(joinedTriangles.draw())
|
139 | 139 | -->
|
140 | 140 |
|
141 | 141 | 因为我们总是需要声明完整的返回类型,所以暴露关于形状创建的详细信息会导致类型泄露,这些泄漏的类型本不应成为绘制几何形状程序模块公开接口的一部分。模块内部的代码可以以多种不同的方式构建相同的形状,而其他使用该形状的模块外部代码不应需要考虑关于变换几何形状的具体实现细节。
|
142 |
| -像 `JoinedShape` 和 `FlippedShape` 这样的包装类型(wrapper types)对模块的用户来说并不重要,它们不应被可见。该模块的公开接口包括了连接和翻转形状等操作,这些操作会返回另一个经过操作后的 `Shape` 值。 |
| 142 | +像 `JoinedShape` 和 `FlippedShape` 这样的包装类型(wrapper types)对模块的用户来说并不重要,它们不应该被暴露出去。该模块的公开接口包括了连接和翻转形状等操作,这些操作会返回另一个经过操作后的 `Shape` 值。 |
143 | 143 |
|
144 | 144 | ## 返回一个不透明类型
|
145 | 145 |
|
@@ -314,7 +314,7 @@ func invalidFlip<T: Shape>(_ shape: T) -> some Shape {
|
314 | 314 | ```
|
315 | 315 | -->
|
316 | 316 |
|
317 |
| -如果你用一个 `Square` 调用这个函数,它会返回一个 `Square`;否则,它会返回一个 `FlippedShape`。这违反了只返回同一种单一类型值的要求,使得 `invalidFlip(_:)` 成为不合法的代码。修复 `invalidFlip(_:)` 的一种方法是将正方形特例的处理移入 `FlippedShape` 的实现中,这样可以让这个函数始终返回一个 `FlippedShape` 值: |
| 317 | +如果你用一个 `Square` 调用这个函数,它会返回一个 `Square`;否则,它会返回一个 `FlippedShape`。这违反了只能返回同一种类型值的要求,使得 `invalidFlip(_:)` 成为不合法的代码。修复 `invalidFlip(_:)` 的一种方法是将正方形特例的处理移入 `FlippedShape` 的实现中,这样可以让这个函数始终返回一个 `FlippedShape` 值: |
318 | 318 |
|
319 | 319 | ```swift
|
320 | 320 | struct FlippedShape<T: Shape>: Shape {
|
|
0 commit comments