File tree Expand file tree Collapse file tree 1 file changed +2
-2
lines changed Expand file tree Collapse file tree 1 file changed +2
-2
lines changed Original file line number Diff line number Diff line change @@ -207,7 +207,7 @@ protoFlippedTriangle == sameThing // 错误
207
207
208
208
将协议类型作为函数的返回类型能更加灵活,函数只要返回遵循协议的类型即可。然而,更具灵活性导致牺牲了对返回值执行某些操作的能力。上面的例子就说明了为什么不能使用 == 运算符 —— 它依赖于具体的类型信息,而这正是使用协议类型所无法提供的。
209
209
210
- 这种方法的另一个问题在于,变换形状的操作不能嵌套。翻转三角形的结果是一个 ` Shape ` 类型的值,而 ` protoFlip(_:) ` 方法的则将遵循 ` Shape ` 协议的类型作为形参,然而协议类型的值并不遵循这个协议;` protoFlip(_:) ` 的返回值也并不遵循 ` Shape ` 协议。这就是说 ` protoFlip(protoFlip(smallTriange )) ` 这样的多重变换操作是非法的,因为经过翻转操作后的结果类型并不能作为 ` protoFlip(_:) ` 的形参。
210
+ 这种方法的另一个问题在于,变换形状的操作不能嵌套。翻转三角形的结果是一个 ` Shape ` 类型的值,而 ` protoFlip(_:) ` 方法的则将遵循 ` Shape ` 协议的类型作为形参,然而协议类型的值并不遵循这个协议;` protoFlip(_:) ` 的返回值也并不遵循 ` Shape ` 协议。这就是说 ` protoFlip(protoFlip(smallTriangle )) ` 这样的多重变换操作是非法的,因为经过翻转操作后的结果类型并不能作为 ` protoFlip(_:) ` 的形参。
211
211
212
212
相比之下,不透明类型则保留了底层类型的唯一性。Swift 能够推断出关联类型,这个特点使得作为函数返回值,不透明类型比协议类型有更大的使用场景。比如,下面这个例子是 [ 泛型] ( ./22_Generics.md ) 中讲到的 ` Container ` 协议:
213
213
@@ -246,4 +246,4 @@ print(type(of: twelve))
246
246
// 输出 "Int"
247
247
```
248
248
249
- ` twelve ` 的类型可以被推断出为 ` Int ` , 这说明了类型推断适用于不透明类型。在 ` makeOpaqueContainer(item:) ` 的实现中,底层类型是不透明集合 ` [T] ` 。在上述这种情况下,` T ` 就是 ` Int ` 类型,所以返回值就是整数数组,而关联类型 ` Item ` 也被推断出为 ` Int ` 。` Container ` 协议中的 ` subscipt ` 方法会返回 ` Item ` ,这也意味着 ` twelve ` 的类型也被能推断出为 ` Int ` 。
249
+ ` twelve ` 的类型可以被推断出为 ` Int ` , 这说明了类型推断适用于不透明类型。在 ` makeOpaqueContainer(item:) ` 的实现中,底层类型是不透明集合 ` [T] ` 。在上述这种情况下,` T ` 就是 ` Int ` 类型,所以返回值就是整数数组,而关联类型 ` Item ` 也被推断出为 ` Int ` 。` Container ` 协议中的 ` subscipt ` 方法会返回 ` Item ` ,这也意味着 ` twelve ` 的类型也被能推断出为 ` Int ` 。
You can’t perform that action at this time.
0 commit comments