2015-10-29 53 views
2

我有一个这样的枚举:自定义类型的枚举斯威夫特符合可哈希协议

enum Animals { 
    case Cow  (MyCowClass) 
    case Bird (MyBirdClass) 
    case Pig  (MyPigClass) 
    case Chicken (MyChickenClass) 
} 

每种类型的符合哈希的协议。此枚举就成为一个不同类的属性:

class Farm { 
    let name = "Bob's Farm" 
    var animal = Animals 

    required init(animal: Animals) { 
     self.animal = animal 
    } 

我想从本案的情况下获得的哈希值,并利用它来进行枚举,所以我可以使用名称&使农场类可哈希动物。

回答

5

您可能会使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 ... 
} 

27:11 Farm类,如:

class Farm : Hashable  { 

    var hashValue: Int { 
     return [name.hashValue, animal.hashValue].hashValue 
    } 
} 
func ==(lhs: Farm, rhs: Farm) -> Bool { 
    return ... 
} 

最后,INTS的容器实现属性hashValue

extension CollectionType where Generator.Element: Int { 
    var hashValue: Int { 
     return ... 
    } 
} 

适当的算法rithms,你可以在网上搜索 - 例如:http://www.eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx

3

的替代接受的答案,假设你不希望基于关联的对象上的枚举如下:

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 
      } 
     } 
    } 
} 
+0

啊,我看你在那里做了什么。感谢您的选择。 –

相关问题