自定义类型的Swift枚举符合哈希协议

自定义类型的Swift枚举符合哈希协议,swift,swift2,Swift,Swift2,我有这样一个枚举: enum Animals { case Cow (MyCowClass) case Bird (MyBirdClass) case Pig (MyPigClass) case Chicken (MyChickenClass) } 每种类型都符合哈希协议。然后,此枚举将成为另一个类的属性: class Farm { let name = "Bob's Farm" var animal = Animals

我有这样一个枚举:

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
    }

我想从案例的实例中获取散列值,并将其用于枚举,以便使用name&animal使Farm类可散列

您可以使动物可散列,例如:

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 ...
}
农场
,例如:

class Farm : Hashable  {

    var hashValue: Int {
        return [name.hashValue, animal.hashValue].hashValue
    }
}
func ==(lhs: Farm, rhs: Farm) -> Bool {
    return ...
}
最后,int的容器实现一个属性
hashValue

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

对于适当的算法,您可以在web上搜索-例如:

假设您不希望基于关联对象的枚举,则接受答案的替代方法如下所示:

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

啊,我知道你在那里做了什么。谢谢你的选择。