読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

SwiftのenumのrawValueは生の値じゃない

Swiftプログラミング言語が発表されて今年は10年目で、私も10年近く書いてきました。
そんな私が、「今まで何勘違いしてたの?」とショックを受けたことがこれ。

SwiftのenumのrawValueは生の値じゃない

まあ、StringをrawValueにできる時点でそういう気はしていたのですが…

enum SomeEnum: Int {
    case aCase
}

enum AnotherEnum: Int {
    case aCase
    case bCase
}

print(MemoryLayout<SomeEnum>.size, MemoryLayout<AnotherEnum>.size, MemoryLayout<Int>.size)

上記コードをPlaygroundsで走らせると、出力は、

0 1 8

となります。

caseが1つしかない時にはメモリを消費せず、caseが2つの時は1バイトです。Intのサイズ8と一致しません。

みなさん知ってましたか?


ちなみに

print(MemoryLayout<AnotherEnum?>.size)

の出力は

1

です。つまりOptionalにしても(多分、caseの数が128以下なら)メモリフットプリントは増えません。いいですね。

Optionalは9バイトになります。
Intに8バイトも普通要らないので、むしろ8バイトのOptinal_Int型が欲しいです。