gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 06:19:10 46 4
gpt4 key购买 nike

我想使用自定义枚举数组作为字典键,但我很难弄清楚如何使数组符合 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/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com