问题描述
我想知道是否有关于使用 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
,这不是真的 - ManagerDelegate
是 SomeManagerDelegate
类型,这是一个完全不相关的协议。即使它是= 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。