ios - 使枚举数组符合 Hashable 以用作字典键

标签 ios arrays swift dictionary enums

我想使用自定义枚举数组作为字典键,但我很难弄清楚如何使数组符合 Hashable。编译器告诉我 [Symbol] 不符合 Hashable。我需要做什么才能编译它?

我搞砸了对 Array 的扩展,其中 Element:Symbol,但我不知道如何以这种方式添加协议(protocol)。

enum Symbol:Hashable, Equatable {
    case Dot
    case Dash

    var value:Int {
        get {
            switch self {
            case .Dot:          return 0
            case .Dash:         return 1
        }
    }

    var hashValue:Int {
        return self.value
    }  
}

func ==(left: Symbol, right: Symbol) -> Bool {
    return left.value == right.value
}

struct MorseDictionary {
    static let symbolToStringDictionary:[[Symbol]:String] = [
        [.Dot, .Dash]:"A"
    ]
}

最佳答案

在 Swift 2.2 中,您不能创建仅限于特定类型数组的扩展

因此您不能将 Symbol 数组符合 HashableEquatable。 这意味着您不能将符号数组用作字典中的键。

当然你可以创建一个扩展使 Array (every array!!) EquatableHashable 但这是一个疯狂的方法,因为显然你将永远无法提供有效的实现。

但是你可以采用另一种方法

首先你的枚举可以这样重写

enum Symbol: Int {
    case Dot = 0, Dash
}

接下来你需要一个 Symbol 数组的包装器

struct Symbols: Hashable, Equatable {
    let value: [Symbol]

    // you can use a better logic here
    var hashValue: Int { return value.first?.hashValue ?? 0 }
}

func ==(left: Symbols, right:Symbols) -> Bool {
    return !zip(left.value, right.value).contains { $0.0 != $0.1 }
}

现在你可以创建你的字典了

let dict: [Symbols:String] = [Symbols(value: [.Dot, .Dash]) : "A"]

关于ios - 使枚举数组符合 Hashable 以用作字典键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37569250/

相关文章:

java - 创建通用 HashMap 数组

javascript - 使数组对象都具有相同的键

json - 试图比较任何?带字符串

iOS 循环闹钟应用程序 - Swift

ios - self.tabBarController 有时为零

ios - 架构 arm64 错误 Xcode 7.3 的 UIFoundation 2 切片

ios - Flurry - 用户获取分析 (UAA) - 无安装

javascript - 用 JavaScript 写一个更好的 IF return 语句

ios - 将ScrollView添加到UIView中

ios - 如何为不同的设备缩放按钮