我有protocol
这样:
protocol Parent {
associatedtype ValueType
mutating func foo(value: ValueType) -> Void
}
我将其扩展到另一个protocol
:
protocol Child: Parent {
var storedProperty: SomeRandomType? // Need this for the extension!
}
然后我在这里实现了一些默认行为:
extension Child {
mutating func foo(value: ValueType) -> Void {
// Ensure storedProperty is initialised and
// store value into storedProperty
}
}
现在,在测试用例中
struct MyChildImpl: Child {
typealias ValueType = AnotherRandomType
}
此时,XCode向我显示了3个错误:
- 类型'MyChildImpl'不符合协议'Child'
- 类型'MyChildImpl'不符合协议'Parent'
- 协议'Child'只能用作通用约束,因为它具有Self或关联类型要求
这是我第一次为可能有'mixins'的结构转换单基类 - 我做错了什么?
谢谢你的时间!
答案 0 :(得分:0)
由于您在子协议的定义中指定了父协议,因此您无法在扩展中推迟协议合规性。所有协议合规性必须在分配协议的块内执行。
这与编译器(在其当前状态下)如何检查协议合规性有关。这解释了您的错误。
答案 1 :(得分:0)
我的主要问题是Protocol 'Child' can only be used as a generic constraint because it has Self or associated type requirements
(其他问题相当容易解决) - 我决定Type Erasure解决问题