迅速。协议类型为字典键

时间:2016-12-21 05:04:49

标签: swift generics protocols

我一直在考虑使用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;协议,并能够使用这些结构作为字典键。

0 个答案:

没有答案
相关问题