7
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

【Swift】fatalError関数によるプログラムの終了

fatalError関数 とは

Optional<Wrapped>型やResult<Success, Failure>型、do-catch文などの
エラー処理を書くことにより、様々なメリットがありました。

1つ目、利用者が失敗に遭遇する機会を減らす。
2つ目、失敗の内容を利用者に伝えて復帰操作を促すことができる。

などが主なメリットになります。

しかし、エラーの中にはそもそも発生することが想定されておらず、
想定されていないので復帰方法が存在しないようなエラーもあります。

そうしたケースでは、プログラムを終了させてしまうのも選択肢の一つです。

そのプログラムを強制させる方法の一つがfatalError( )関数になります。

fatalError( )関数は、
その箇所が実行されること自体が想定外であることを宣言するための関数です。

実装方法

fatalError( )関数は引数に終了時のメッセージを取り、
fatalError( )関数を実行すると、実行時エラーが発生しプログラムが終了します。

実行結果は、引数で指定したメッセージに加えソースファイル名と行番号を出力します。


fatalError("想定しないエラーが発生したためプログラムを終了します。")

実効結果
Fatal error: 想定しないエラーが発生したためプログラムを終了します: file __lldb_expr_369/MyPlayground.playground, line 2

Never型

fatalError( )関数の戻り値はNever型になります。
Never型は特殊な型で、値を返さない型になります。

値を返さないと聞くと、
Void型と似たようなものかな?と思いますがそういう意味ではなく、
関数の実行時にプログラムを終了するため値を返すことはないという意味合いになります。

Never型を戻り値に持つ関数を実行すると、
その箇所以降の処理は実行されないものとみなされるので、
戻り値を返す必要がなくなります。

fatalError( )の使い方としては下記のような使い方になります。
下記のサンプルコードでは戻り値を記載しなくてもコンパイルエラーになりません。


func sample(value: Int) -> Int {
    fatalError("戻り値は必要なくなります。")
}

このような使い方を上手く利用すれば、
想定しない状況における処理の実装が不要となります。

次のサンプルコードでは、ランキングに応じてメダルが渡されます。
1位〜3位はメダルがもらえますが、4位以降はもらえません。

また、引数rankはInt型なので、
Switch文で特に指定しない限りInt型の値を網羅する必要があります。

そういう時のために1位、2位、3位以外の値をdefaultとし、
defaultにはfatalError( )関数を定義します。


func sample(rank: Int) -> String {
    switch rank {
    case 1:
        return "1位です。金メダルを差し上げます。"
    case 2:
        return "2位です。銀メダルを差し上げます。"
    case 3:
        return "3位です。銅メダルを差し上げます。"
    default:
        fatalError("4位以降はメダルがありません。")
    }
}

このような、本来想定しない状況を適切に表すことができるのがfatalError( )関数になります。

利用タイミング

想定外の状況ではプログラムを終了させる

想定外の状況と一言で言われると少し難しいですが、
実装上想定外の状況を考慮しなくても良いことが明らかな場合は、
fatalError( )関数を利用して想定外の状況ではプログラムを終了して良いと思います。

逆に、外部リソースなどに依存している場合などの想定外の挙動が十分起こり得る場合は、
実行を継続できる実装にした方が良いと思います。

短いですが、以上がfatalError( )関数についての説明になります!

また、他のエラー処理についても記事にしているのでぜひご覧ください。
【Swift】Optional<Wrapped>型でエラー処理を行う
【Swift】Result<Success, Failure>型でエラー処理を行う
【Swift】do-catch文でエラー処理を行う(その1)
【Swift】アサーションによるプログラムの終了

最後までご覧いただきありがとうございました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
7
Help us understand the problem. What are the problem?