Xcode 9.1 で致命的なエラーの表示が改善されます

  • 10
    Like
  • 0
    Comment

Swift.org にて次のブログ記事が2017年10月5日付で公開されました。

Xcode 9.1 Improves Display of Fatal Errors - Swift.org

個人的にとてもうれしいアップデートなので、Qiita にて共有できればと思います。
(ほぼブログ記事の日本語訳…)

EXC_BAD_INSTRUCTIONEXC_BREAKPOINT

let element = array[index]  // #1
let nc = self.navigationController! // #2
precondition(index > 0, "Index must be greater than zero.")  // #3

以上のコードにおいて、

  • #1: index0 より小さいか array.count - 1 よりも大きい場合
  • #2: self.navigationControllernil の場合
  • #3: index0 の場合

プログラムは終了してしまいます。このように、期待する値が間違っている場合やコードにバグがある場合、Swift のプログラムは終了します。
アプリケーションの開発中には、これら幾つかの前提条件が満たされない状態でデバッグを行うことが多いかと思います。
この理由で Swift プログラムが終了してしまった時、Xcode 9.1 以前のデバッガでは他のタイプのクラッシュ時と同じように、EXC_BAD_INSTRUCTIONEXC_BREAKPOINT がエラーメッセージとして表示されていました。

これは、私のような超初心者開発者やプロの開発の方にとっても混乱の原因となっています。
現に、私も EXC_BAD_INSTRUCTIONEXC_BREAKPOINT でググって、結局配列の添字ミスであったりする場合が何度もありました。

Xcode 9.1 でのエラー表示の改善

Xcode 9.1 Improves Display of Fatal Errors - Swift.org より
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年後半にリリース予定となっています。