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, Equatable
e 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