微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift Enum的自定义类型符合hashable协议

我有这样的枚举:

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
    }

我想从案例的实例中获取哈希值并将其用于枚举,这样我就可以使用名称&动物.

解决方法

你可以让动物可以洗,例如:

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

最后,Ints的容器实现了一个属性hashValue

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

对于适当的算法,您可以搜索网络 – 例如:http://www.eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐