在Swift协议中约束相关类型

时间:2017-04-02 12:18:59

标签: swift swift-protocols

我正在编写一些代码片段来了解关联类型的工作原理,但我遇到了一个错误,我不确定如何解释。我写的代码发布在下面以供参考。

// A basic protocol
protocol Doable {
    func doSomething() -> Bool
}

// An extension that adds a method to arrays containing Doables
extension Array where Element: Doable {

    func modify(using function:(Array<Doable>)->Array<Doable>) -> Array<Doable> {
        return function(self)
    }
}

// Another protocol with an associated type constrained to be Doable
protocol MyProtocol {
    associatedtype MyType: Doable

    func doers() -> Array<MyType>

    func change(_:Array<MyType>) -> Array<MyType>
}

// An simple extension
extension MyProtocol {

    func modifyDoers() -> Array<MyType> {
        return doers().modify(using: change)
    }
}

我已将MyType约束为Doable,但编译器抱怨它无法转换(Array<Self.MyType>) -> Array<Self.MyType> to expected argument type (Array<Doable>) -> Array<Doable>。谁能解释一下这里发生了什么以及如何让编译器满意?

1 个答案:

答案 0 :(得分:1)

正如错误消息所示,modify函数需要类型为Array<Doable>的参数,并且您正在传递类型为Array<MyType>的参数。

问题源于modify的定义,您在参数中明确使用Doable,排除除Doable之外的所有其他类型 - 并且相关类型是不是typealiases,MyType无法转换为Doable

修复方法是将Doable函数中modify的所有匹配项更改为Element,如Swift文档中所示:Extensions with a Generic Where Clause