我正在编写一些代码片段来了解关联类型的工作原理,但我遇到了一个错误,我不确定如何解释。我写的代码发布在下面以供参考。
// 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>
。谁能解释一下这里发生了什么以及如何让编译器满意?
答案 0 :(得分:1)
正如错误消息所示,modify
函数需要类型为Array<Doable>
的参数,并且您正在传递类型为Array<MyType>
的参数。
问题源于modify
的定义,您在参数中明确使用Doable
,排除除Doable
之外的所有其他类型 - 并且相关类型是不是typealiases,MyType
无法转换为Doable
。
修复方法是将Doable
函数中modify
的所有匹配项更改为Element
,如Swift文档中所示:Extensions with a Generic Where Clause。