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
Intに8バイトも普通要らないので、むしろ8バイトのOptinal_Int型が欲しいです。