Swift Digest
Blog | Swift.org Blog

Xcode 9.1 で fatal error の表示が改善

Xcode 9.1 Improves Display of Fatal Errors

このダイジェストはClaude Opus 4.7 / 4.8によって生成されたものです(License)。原文はこちら

この記事の要点

背景: 前提条件の違反による終了

Swift には、プログラムが満たすべき前提条件を表現する言語機能があり、その前提が実行時に満たされないとプログラムが終了します。たとえば配列への添字アクセスは、添字が範囲内であるという前提を暗黙に表現しています。

// 'index' が 0 未満、または 'array.count - 1' を超える場合、プログラムは終了する。
let element = array[index]

オプショナルの強制アンラップも、失敗時にプログラムを終了させる代表的な操作です。

// 'self.navigationController' が nil の場合、プログラムは終了する。
let nc = self.navigationController!

precondition も同様です。

// 'index' が 0 以下の場合、プログラムは終了する。
precondition(index > 0, "Index must be greater than zero.")

前提条件が誤っていたりコードにバグがあったりした場合、Swift はプログラムが必ず trap することを保証します。特に開発中は、何らかの前提条件が満たされずプログラムが終了し、デバッガがそれを表示する、という状況がよく起こります。

しかし Xcode 9.1 より前のデバッガでは、こうした状況がほかのクラッシュと区別なく ―― 通常は低レベルな Mach 例外である EXC_BAD_INSTRUCTIONEXC_BREAKPOINT として ―― 表示されるだけでした。これが初心者にも熟練者にも混乱の元になっていました。

Xcode 9.1 で何が変わるのか

Xcode 9.1 では、fatal error の表示が大きく改善されました。デバッガ実行中に trap が発生すると、Xcode は trap が起きたエディタ上の該当箇所に 失敗の理由(failure reason) を表示します。

実行時の trap を引き起こす多くのイベントがカバーされており、次のものが含まれます。

注意点

この改善された表示は、アプリのエントリポイントが Swift で書かれている場合にのみ 利用できます。具体的には、@UIApplicationMain / @NSApplicationMain 属性を付けた app delegate を持つアプリが対象です。