enumはデフォルトでHashable,Equalableが実装されているっぽいので、辞書のキーに指定できる
enum Lang {
case Java, ObjC, Swift
}
let d = [Lang.Java: "java"]
println(d[Lang.Java]!)//=> java
しかし、値を持たせるとHashableに準拠していないとエラーになる。
どうやらこの場合、Hashable(とEqualableも)自分で実装しないといけないみたい。
enum Lang {
case Java(Int), ObjC, Swift
}
let d = [Lang.Java: "java"]//Error: Type '(Int) -> Lang' does not conform to protocol 'Hashable'
enum Lang: Hashable {
case Java(Int), ObjC, Swift
func toInt() -> Int {
switch self {
case .Java(let i):
return 0
case .ObjC:
return 1
case .Swift:
return 2
}
}
var hashValue: Int {
get { return toInt() }
}
}
func ==(lhs: Lang, rhs: Lang) -> Bool {
return lhs.toInt() == rhs.toInt()
}
let lang = Lang.Java(0)
let d = [lang: "java"]
println(d[lang]!)//=> java
値持たせる場合は素直にあきらめた方がいいかな..