protocol Merger {
associatedtype Element
func merge(_ a:Element, _ b:Element) -> Element
}
class AbstractTest<M:Merger, E> {
typealias Element = E
var a, b:E
var merger:M
init(merger:M, a:E, b:E) {
self.merger = merger
self.a = a
self.b = b
}
func test() -> E {
return self.merger.merge(a, b)
}
}
error: Cannot invoke 'merge' with an argument list of type '(E, E)'
I expect to abstract a Merger protocol for external calls. How do I use swift to implement it?
The typealias Element = E creates a new typealias on the class AbstractTest, which does not influence the associated types of M. Instead, you should add a generic where clause to require M.Element == E.
class AbstractTest<M:Merger> {
var a, b: M.Element
var merger: M
init(merger: M, a: M.Element, b: M.Element) {
self.merger = merger
self.a = a
self.b = b
}
func test() -> M.Element {
return merger.merge(a, b)
}
}