LoginSignup
1
2

More than 5 years have passed since last update.

【Swift】enumのraw valueをオーバーフローさせると?

Last updated at Posted at 2018-10-16

結論

コンパイルエラーで怒られます:innocent:

enum Number: Int {
    case max = 9223372036854775807
    case next    // Integer literal '9223372036854775808' overflows when stored into 'Int'
}

解説

enumのraw valueについて

Swiftのenum(列挙型)はcaseに対応した値を持たせることができます。
この値のことをraw valueといいます。

raw valueを設定するには列挙型の定義で列挙型名の後に続けて:raw valueの型のように書き、それぞれのケースに=で指定します。

enum Number: Int {
    case one = 1
    case two = 2
    case ten = 10
}

Int型のraw valueのデフォルト値は0で、=で指定しなかった場合は直前のケース+1の値になるという特性があります。

enum Number: Int {
    case zero
    case one
    case ten = 10
    case aaa 
}
print(Number.zero.rawValue)  // 0
print(Number.one.rawValue)   // 1
print(Number.ten.rawValue)   // 10
print(Number.aaa.rawValue)   // 11

オーバーフローについて

オーバーフローとは、限界を超えてしまった状態です(ざっくり)
SwiftのInt型は符号付き整数を表すので、64ビット環境で
-9223372036854775808から9223372036854775807までの数値を表現できます。
この値はInt.minおよびInt.maxで取得できます。
minを下回る、もしくはmaxを上回る計算などするとエラーとなります。

print(Int.min)  // -9223372036854775808
print(Int.max)  // 9223372036854775807

// これはオーバーフローによるエラー
Int.max + 1

ということで

enumの自動採番でIntの限界を超えるとどうなるのか気なってしまった結果、この記事ができあがりました。
結果は冒頭の通り、普通にコンパイルエラーです:innocent:

922京3372兆368億5477万5807を超えるケースを列挙する際には注意しましょう:innocent:

1
2
0

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
1
2