Операция над массивом структур, реализующих 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