2

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

Lukasz
  • 19,816
  • 17
  • 83
  • 139
  • 1
    check if you can find the answer here http://stackoverflow.com/questions/33112559/protocol-doesnt-conform-to-itself – Luzo Apr 25 '17 at 05:42

0 Answers0