我一直在考虑使用Protocol类型作为字典键的方法。我在操场上制作了一个简单的测试代码:
//Custom Protocol conforms to Hashable
protocol Transport: Hashable {
var name: String {get set}
var quantity: Int {get set}
}
//Transport Protocol extension
extension Transport {
var hashValue: Int {
return name.hashValue ^ quantity.hashValue
}
}
//Equatable Protocol (Since Hashable conforms to Equatable)
func ==<T:Transport>(lhs: T, rhs: T) -> Bool {
return lhs.hashValue == rhs.hashValue
}
//Struct Car
struct Car: Transport {
var name: String = ""
var quantity: Int = 1
init(name: String, quantity: Int) {
self.name = name
self.quantity = quantity
}
}
//Struct Plane
struct Plane: Transport {
var name: String = ""
var quantity: Int = 1
init(name: String, quantity: Int) {
self.name = name
self.quantity = quantity
}
}
let t1 = Car(name: "Ford", quantity: 10)
let t2 = Plane(name: "Airbus", quantity: 2)
下一行会出错:二元运算符&#39; ==&#39;不能应用于类型&#39; Car&#39;和&#39; Plane&#39;
if t1 == t2 {
print("It's the same transport")
}
下一行会出现此错误:使用&#39;运输&#39;作为符合协议的具体类型&#39; Hashable&#39;不受支持
var arrayOfTransports = [Transport:[Int]]()
我要做的是比较符合&#39;运输&#39;协议,并能够使用这些结构作为字典键。