Операция над массивом структур, реализующих Equatable

У меня есть множество различных структур, все реализацииEquatable протокол и пытаюсь передать его в функцию, которая ожидает коллекциюwhere T.Iterator.Element: Equatable, Я знаю, как решить эту проблему, используя классы и просто создаваяclass Vehicle: Identifiable, Equatable, а затем сделатьCar а такжеTractor воплощать в жизньVehicle, Однако я хотел бы знать, возможно ли это с использованием структур и протоколов?

Вот надуманный пример того, что я пытаюсь сделать

//: 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

Ответы на вопрос(1)

Ваш ответ на вопрос