LoginSignup
10
11

More than 5 years have passed since last update.

enumをDictionaryのkeyに指定する

Last updated at Posted at 2014-08-15

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

値持たせる場合は素直にあきらめた方がいいかな..

10
11
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11