The code:
protocol AProtocol {}
protocol ABProtocol: AProtocol {}
struct ABStruct: ABProtocol {}
struct Wrapper<T> {
let object: T
}
extension Array where Element == Wrapper<AProtocol> {
func merge(with otherArray: [Element]) {}
}
let wrapper1: Wrapper<ABProtocol> = Wrapper(object: ABStruct())
let wrapper2: Wrapper<ABProtocol> = Wrapper(object: ABStruct())
let wrappers1 = [wrapper1, wrapper2]
let wrappers2 = [wrapper2, wrapper1]
// Following produces compilation error:
// '[Wrapper<ABProtocol>]' is not convertible to 'Array<Wrapper<AProtocol>>'
let result = wrappers1.merge(to: wrappers2)
This produces compilation error:
'[Wrapper<ABProtocol>]' is not convertible to 'Array<Wrapper<AProtocol>>'
even if ABProtocol
inherits (extends) AProtocol
.
Is it possible to declare Array
(or Collection
) extension for generic elements constrained to a protocol and any sub-protocol inheriting from it?
Gist: https://gist.github.com/lukaszmargielewski/48fe181264bbc468e1c3b80aec0a6516