Tôi có một loạt các cấu trúc khác nhau, tất cả thực hiện giao thức Equatable
và đang cố gắng chuyển nó tới một hàm mong đợi một bộ sưu tập where T.Iterator.Element: Equatable
. Tôi biết cách giải quyết vấn đề này bằng cách sử dụng các lớp và chỉ cần tạo một class Vehicle: Identifiable, Equatable
và sau đó thực hiện Car
và Tractor
triển khai Vehicle
. Tuy nhiên tôi muốn biết nếu điều này là có thể với việc sử dụng cấu trúc và giao thức?Thao tác trên một mảng các cấu trúc thực hiện Equatable
Dưới đây là một ví dụ contrived về những gì tôi đang cố gắng để làm
//: 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
Đó là thực sự thông minh, cảm ơn bạn! Tôi sẽ thử nó để xem nó phù hợp với codebase của tôi như thế nào, nhưng tôi nghĩ đây là giải pháp phù hợp cho vấn đề trong tầm tay. Chúc mừng! –
Vui lòng trợ giúp @MarkoHlebar :) – Hamish