Swift言語で、下記はシンプルなenumの書き方です。
enum MobileArmor { case bigro, zakrello }
MobileArmorというenum(列挙型)を作成しました。このMobileArmorを変数に入れたい場合下記のように記述します。
let mobileArmor: MobileArmor = MobileArmor.zakrello
mobileArmor変数の中を.zakrelloに設定しています。この変数の状態によってswitch文で処理を変更したい場合下記のように書きます。
let mobileArmor: MobileArmor = .zakrello switch mobileArmor { case .zakrello: print("zakrello") break case .bigro: print("bigro") }
enumはCaseIterableやHashable, Codableなどをprotocolをつけることが可能です。
CaseIterableの場合AllCasesが使えるようになります。このAllCasesを使えば下記のコードのようにenumに設定している内容を確認することができます。
enum MobileArmor: CaseIterable { case bigro, zakrello } MobileArmor.allCases.forEach { print ( $0.self) }
enum型にHashableを設定した場合は、hashValueとhash(into hasher: inout Hasher)が使えますがHashableを設定しなくてもhashValueなどは利用できるようでした。hash(into: &hasher)を設定するためのHasherは、任意のシーケンスを整数にマッピングするために使用できます。combine()とfinalize()をつかうようです。下記に例を書いてみますがあってるのか不明です。
enum MobileArmor: CaseIterable, Hashable { case bigro, zakrello } let mobileArmor: MobileArmor = .zakrello var hasher1 : Hasher = Hasher() hasher1.combine(128) hasher1.finalize() mobileArmor.hash(into: &hasher1)
Codableも他と同じく enumに設定できるprotocolです。Codableは下のコードのようにDecodableとEncodableが合わさった機能を持っています。
public typealias Codable = Decodable & Encodable
MobileArmor enum型にStringとCodableを設定しました。Codableを指定しているので JSONのDecodeが可能です。
enum MobileArmor: String, Codable, CaseIterable, Hashable { case bigro = "ビグロ" case zakrello = "ザクレロ" } do { let amobileArmor = try JSONDecoder().decode(MobileArmor.self, from: "\"ザクレロ\"".data(using: .utf8)! ) switch amobileArmor { case .zakrello: print("zakrello") break case .bigro: print("bigro") } } catch { }
「ザクレロ」という文字列をMobileArmor型にdecodeできました。JSONDecoderを使わない方法もあると思いますが、手っ取り早いコード例です。Codableが設定されているので、JSONEncoder()を使えば下のコードのように文字列に変換することもできます。
do { print( String(data: try JSONEncoder().encode(MobileArmor.bigro), encoding: .utf8)! ) } catch { }