是否有关于使用 `=` 和 `:` 的 Swift 协议关联类型的信息?

问题描述

我想知道是否有关于使用 associatedtype 而不是 = 的 Swift 协议 : 的任何文档。

例如。 associatedtype Thing = SomeOtherThing 对比 associatedtype Thing: SomeOtherThing

不要与(可能让我感到困惑的)typealias Thing = SomeOtherThing 混淆,我相信它始终是 =

我试图抽象一个包含委托的类的用法,并将 = 用于 associatedtype,直到我遇到一个问题,即该类型的变量没有公开其属性由于 = 而需要通常的 :,这在某种程度上对我来说是有道理的,但是当我将一个特定的 = 更改为 : 时,它导致一切都要打破。我在下面包含了一个示例,其中的想法是能够自由地获取/设置委托对象,但或多或​​少有一个协议说它的委托必须是关联类型的类型(使用 {{1} }) 而不是像 = 似乎建议的那样只是“你必须遵守这个”。

我也不知道这一步是否走得太远,还有其他一些更好的方法可以通过测试来表达这一点。这似乎是必需的,因为我不能完全依赖外部对象在测试中按预期工作,而是需要模拟它在某些情况下故意失败等。

:

解决方法

:attributes(opt) access-level-modifier(opt) 'associatedtype' typealias-name type-inheritance-clause(opt) typealias-assignment(opt) generic-where-clause(opt) 是关联类型声明的两个独立部分,而不是相互排斥的。这是 protocol associated type declaration 的完整语法:

: TypeName

type-inheritance-clause 部分是 = TypeName,而 typealias-assignment: TypeName

TypeName 限制关联类型可以是什么类型,即它必须继承/符合 : SomeManagerDelegate。这就是 SomeManager.DelegateType 在您的情况下不起作用的原因。你是说 SomeManagerDelegate 必须是某种 Manager,但对于 Manager.delegate,这不是真的 - ManagerDelegateSomeManagerDelegate 类型,这是一个完全不相关的协议。即使它是= TypeName,它也不起作用,因为protocols don't conform to themselves

= SomeManagerDelegate 为关联类型设置默认类型。如果编译器无法推断一致性的关联类型应该是什么类型,并且您也没有明确说明它,它将使用该类型。但在你的情况下,这个事实并不重要。真正使您的代码起作用的不是: SomeManagerDelegate添加,而是约束Manager删除。您不再限制关联类型应该是什么类型(它可以是任何东西!),因此对于 ManagerDelegate,关联类型现在可以推断为 typealias DelegateType = ManagerDelegate 。请注意,您不必明确地说:

= SomeManagerDelegate

实际上,您可以完全删除 associatedtype DelegateType 并说:

=

因此,= TypeName 是“唯一将它保持在一起的东西”与事实相去甚远。

这个 project | bar | | src | | | src.cpp (include "a.hpp") | | | CMakeLists.txt (3) | | third_party | | | a.hpp | | CMakeLists.txt (2) | main.cpp (include "bar/src/src.cpp") | CMakeLists.txt (1) 语法似乎不是 very well documented。这是一个相关的 Swift forums post

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...