Swift.org にて次のブログ記事が2017年10月5日付で公開されました。
Xcode 9.1 Improves Display of Fatal Errors - Swift.org
個人的にとてもうれしいアップデートなので、Qiita にて共有できればと思います。
(ほぼブログ記事の日本語訳…)
EXC_BAD_INSTRUCTION
と EXC_BREAKPOINT
let element = array[index] // #1
let nc = self.navigationController! // #2
precondition(index > 0, "Index must be greater than zero.") // #3
以上のコードにおいて、
-
#1
:index
が0
より小さいかarray.count - 1
よりも大きい場合 -
#2
:self.navigationController
がnil
の場合 -
#3
:index
が0
の場合
プログラムは終了してしまいます。このように、期待する値が間違っている場合やコードにバグがある場合、Swift のプログラムは終了します。
アプリケーションの開発中には、これら幾つかの前提条件が満たされない状態でデバッグを行うことが多いかと思います。
この理由で Swift プログラムが終了してしまった時、Xcode 9.1 以前のデバッガでは他のタイプのクラッシュ時と同じように、EXC_BAD_INSTRUCTION
や EXC_BREAKPOINT
がエラーメッセージとして表示されていました。
これは、私のような超初心者開発者やプロの開発の方にとっても混乱の原因となっています。
現に、私も EXC_BAD_INSTRUCTION
や EXC_BREAKPOINT
でググって、結局配列の添字ミスであったりする場合が何度もありました。
Xcode 9.1 でのエラー表示の改善
Xcode 9.1 ではこの致命的なエラーの表示が大幅に改善されたようです。
Xcode 9.1 でデバッグすると、エラーが発生した部分になぜエラーとなったのかについての理由が表示されます。
Xcode 9.1 では以下のイベントについてのエラー表示を網羅しているとのことです。
- forced unwrapping
nil
- forced-try expressions (
try!
) producing an error - out-of-bounds indexing into arrays
- precondition failures
- assertion failures
-
fatalError
calls
この機能は @UIApplicationMain
や @NSApplicationMain
属性を持つアプリケーションが Swift で書かれている場合のみに利用できます。
Xcode 9.1 正式版は 2017年後半にリリース予定となっています。