Operação em uma série de estruturas que implementam o Equatable

Eu tenho uma variedade de estruturas diferentes, todas implementandoEquatable protocolo e estou tentando passá-lo para uma função que espera uma coleçãowhere T.Iterator.Element: Equatable. Eu sei como resolver esse problema usando classes e apenas criando umclass Vehicle: Identifiable, Equatablee depois façaCar eTractor implementoVehicle. No entanto, eu gostaria de saber se isso é possível com o uso de estruturas e protocolos?

Aqui está um exemplo artificial do que estou tentando fazer

//: Playground - noun: a place where people can play

protocol Identifiable {
    var ID: String { get set }
    init(ID: String)
    init()
}

extension Identifiable {
    init(ID: String) {
        self.init()
        self.ID = ID
    }
}

typealias Vehicle = Identifiable & Equatable

struct Car: Vehicle {
    var ID: String

    init() {
        ID = ""
    }

    public static func ==(lhs: Car, rhs: Car) -> Bool {
        return lhs.ID == rhs.ID
    }
}

struct Tractor: Vehicle {
    var ID: String

    init() {
        ID = ""
    }

    public static func ==(lhs: Tractor, rhs: Tractor) -> Bool {
        return lhs.ID == rhs.ID
    }
}

class Operator {
    func operationOnCollectionOfEquatables<T: Collection>(array: T) where T.Iterator.Element: Equatable {
    }
}

var array = [Vehicle]() //Protocol 'Equatable' can only be used as a generic constraint because Self or associated type requirements

array.append(Car(ID:"VW"))
array.append(Car(ID:"Porsche"))
array.append(Tractor(ID:"John Deere"))
array.append(Tractor(ID:"Steyr"))

var op = Operator()
op.operationOnCollectionOfEquatables(array: array) //Generic parameter 'T' could not be inferred

questionAnswers(1)

yourAnswerToTheQuestion