作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想使用自定义枚举数组作为字典键,但我很难弄清楚如何使数组符合 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"
]
}
最佳答案
因此您不能将 Symbol
数组符合 Hashable
或 Equatable
。这意味着您不能将符号数组用作字典中的键。
当然你可以创建一个扩展使 Array (every array!!) Equatable
和 Hashable
但这是一个疯狂的方法,因为显然你将永远无法提供有效的实现。
首先你的枚举可以这样重写
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/
我是一名优秀的程序员,十分优秀!