我有这样的枚举:
enum Animals {
case Cow (MyCowClass)
case Bird (MyBirdClass)
case Pig (MyPigClass)
case Chicken (MyChickenClass)
}
Run Code Online (Sandbox Code Playgroud)
每种类型都符合可混合协议.这个枚举然后成为另一个类的属性:
class Farm {
let name = "Bob's Farm"
var animal = Animals
required init(animal: Animals) {
self.animal = animal
}
Run Code Online (Sandbox Code Playgroud)
我想从案例的实例中获取哈希值并将其用于枚举,这样我就可以使用名称&animal使Farm类可哈希.
你可以制作Animals哈希,例如:
enum Animals : Hashable {
case Cow (MyCowClass)
case Bird (MyBirdClass)
case Pig (MyPigClass)
case Chicken (MyChickenClass)
var hashValue: Int {
switch self {
case .Cow(let v): return v.hashValue
case .Bird(let v): return v.hashValue
case .Pig(let v): return v.hashValue
case .Chicken(let v): return v.hashValue
}
}
}
func ==(lhs: Animals, rhs: Animals) -> Bool {
return ...
}
Run Code Online (Sandbox Code Playgroud)
同样的课程Farm,例如:
class Farm : Hashable {
var hashValue: Int {
return [name.hashValue, animal.hashValue].hashValue
}
}
func ==(lhs: Farm, rhs: Farm) -> Bool {
return ...
}
Run Code Online (Sandbox Code Playgroud)
最后,Ints的容器实现了一个属性 hashValue
extension CollectionType where Generator.Element: Int {
var hashValue: Int {
return ...
}
}
Run Code Online (Sandbox Code Playgroud)
对于适当的算法,您可以搜索网络 - 例如:http://www.eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx
假设您不希望基于关联对象的枚举,则接受答案的替代方案如下:
private enum AnimalType: Int {
case Cow = 0
case Bird = 1
case Pig = 2
case Chicken = 3
}
func == (lhs: Animals, rhs: Animals) -> Bool {
return lhs.hashValue == rhs.hashValue
}
enum Animals: Hashable {
case Cow (MyCowClass)
case Bird (MyBirdClass)
case Pig (MyPigClass)
case Chicken (MyChickenClass)
var hashValue: Int {
get {
switch self {
case .Cow(_):
return AnimalType.Cow.hashValue
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2994 次 |
| 最近记录: |