dictionary - 如何使用 Swift 枚举作为字典键? (符合等式)

标签 dictionary enums swift hashable

我已经定义了一个枚举来表示一个“站”的选择;站由唯一的正整数定义,因此我创建了以下枚举以允许负值表示特殊选择:

enum StationSelector : Printable {
    case Nearest
    case LastShown
    case List
    case Specific(Int)

    func toInt() -> Int {
        switch self {
        case .Nearest:
            return -1
        case .LastShown:
            return -2
        case .List:
            return -3
        case .Specific(let stationNum):
            return stationNum
        }
    }

    static func fromInt(value:Int) -> StationSelector? {
        if value > 0 {
            return StationSelector.Specific(value)
        }
        switch value {
        case -1:
            return StationSelector.Nearest
        case -2:
            return StationSelector.LastShown
        case -3:
            return StationSelector.List
        default:
            return nil
        }
    }

    var description: String {
    get {
        switch self {
        case .Nearest:
            return "Nearest Station"
        case .LastShown:
            return "Last Displayed Station"
        case .List:
            return "Station List"
        case .Specific(let stationNumber):
            return "Station #\(stationNumber)"
        }
    }
    }
}

我想将这些值用作字典中的键。声明字典会产生预期的错误,即 StationSelector 不符合 Hashable。使用简单的散列函数很容易符合 Hashable:

var hashValue: Int {
get {
    return self.toInt()
}
}

但是,Hashable 需要符合 Equatable,而且我似乎无法在我的枚举上定义等于运算符来满足编译器的要求。

func == (lhs: StationSelector, rhs: StationSelector) -> Bool {
    return lhs.toInt() == rhs.toInt()
}

编译器提示这是在一行中的两个声明,并且想在 func 之后放置一个 ;,这也没有意义。

有什么想法吗?

最佳答案

关于枚举作为字典键的信息:

来自 Swift 书:

Enumeration member values without associated values (as described in Enumerations) are also hashable by default.

但是,您的 Enumeration 确实有一个具有关联值的成员值,因此您必须手动添加 Hashable 一致性。

解决方案

您的实现的问题是 Swift 中的运算符声明必须在全局范围内。

只是移动:

func == (lhs: StationSelector, rhs: StationSelector) -> Bool {
    return lhs.toInt() == rhs.toInt()
}

enum 定义之外,它会起作用。

检查 the docs有关更多信息。

关于dictionary - 如何使用 Swift 枚举作为字典键? (符合等式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24562357/

相关文章:

swift - 按值对 Swift 字典数组进行排序

entity-framework - Entity Framework 实体中的枚举类型属性?

ios - prefersLargeTitles 不适用于编程布局

ios - 当 View 已经被按下时如何响应触摸?

python - 按两个键对字典列表进行排序

java - 哪种方法更好地比较方法检查中的值或检查它是否存在于数组中?

Java 枚举泛型

Java 8 流 API :How to handle null value in Map

ios - 将 TableCell 插入正确的部分

python - 从列表创建字典