我定义了一个枚举来表示一个"站"的 Select ;桩号由唯一的正整数定义,因此我创建了以下枚举,以允许负值代表特殊 Select :

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一致,我似乎无法在枚举上定义equals运算符来满足编译器的要求.

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

编译器抱怨这是一行中的两个声明,并希望在func后加;,这也没有意义.

有什么 idea 吗?

推荐答案

有关枚举为字典键的信息:

从Swift手册:

没有关联值的枚举成员值(如中所述

但是,您的枚举确实有一个成员值和一个关联的值,因此您必须手动添加Hashable个一致性.

解决方案

您的实现存在的问题是,Swift中的操作员声明必须在全局范围内.

快走吧:

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

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

查看the docs了解更多信息.

Swift相关问答推荐

如何在init()中使用setter/getters?

UICollectionViewCompostionalLayout Collectionview单元格宽度在重新加载数据后未正确调整大小

NavigationLink和ObservableObject的动画片段

如何将多个完成处理程序转换为异步?

try 从闭包访问返回的字符串时出现无法将类型 '()' 的返回表达式转换为返回类型 'String'编译器错误

无论玩家移动到视图内的哪个位置,如何使用 SpriteKit 让敌人向玩家emits 子弹?

我如何在 swift 中的 viewdidload 之前进行委托?

如何在闭包中使用构造 await sync

如何在一个视图控制器中创建具有相同行为的多个集合视图?

当使用 CGFloat 而不是数字文字时,为什么 node 的位置会发生变化?

这是 Int64 Swift Decoding 多余的吗?

Swift 有没有办法在不使用 switch 语句的情况下获取关联值?

Vapor Swift 如何配置客户端连接超时

否定 #available 语句

调整文本的字体大小以适应 UIButton

如何更改弹出框的大小

将强制向下转换视为可选将永远不会产生零

SwiftUI:将多个 BindableObjects 放入环境

在文本中添加无限行(SwiftUI)

静态成员不能用于类型的实例