2015-10-29 86 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

啊,我看你在那裏做了什麼。感謝您的選擇。 –

相關問題