私はEquatable
プロトコルを実装している異なる構造体の配列を持っていて、それはコレクションを期待する関数に渡そうとしていますwhere T.Iterator.Element: Equatable
。クラスを使用してclass Vehicle: Identifiable, Equatable
を作成し、Car
とTractor
をVehicle
に実装することで、この問題を解決する方法を知っています。しかし、これは構造体とプロトコルを使用することで可能かどうかを知りたいですか?あなたがしたいと - ここEquatableを実装している構造体の配列の操作
は私が
//: 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
、ありがとうございました!私はそれが私のコードベースにどのように適合しているかを調べるためにそれを試してみるでしょうが、私はこれが問題の正しい解決策であると思います。乾杯! –
@MarkoHlebarを助けて幸い:) – Hamish