在Swift 2中实现扩展协议

时间:2016-06-18 13:31:48

标签: swift swift2

我有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'的结构转换单基类 - 我做错了什么?

谢谢你的时间!

2 个答案:

答案 0 :(得分:0)

由于您在协议的定义中指定了协议,因此您无法在扩展中推迟协议合规性。所有协议合规性必须在分配协议的块内执行。

这与编译器(在其当前状态下)如何检查协议合规性有关。这解释了您的错误。

答案 1 :(得分:0)

我的主要问题是Protocol 'Child' can only be used as a generic constraint because it has Self or associated type requirements(其他问题相当容易解决) - 我决定Type Erasure解决问题