Swift/SwiftUIデバッグ方法

デバッグとは、プログラムがどのように動作し、どのようにデータを生成するかを分析し、コードの不具合や問題点を見つけ出す作業のことです。
これらのエラーや欠陥は「バグ」と呼ばれるため、「デバッグ」と呼ばれるようになりました。
また、アプリのパフォーマンスの問題には様々な原因がありますが、そのような問題もデバッグと呼ばれるプロセスを用いて発見し、解決することが可能です。

エラー調査のコツ
開発を進める中で、実装がうまく出来ずにエラーが発生する状況はよくあります。
その場合は、どこまでうまく動作出ていていたのか、どのコードを書いたらエラーになるのかを明確にする必要があります。

機能を実装している途中でエラーになる場合は、まずは、正常とエラーの分岐点を見つけるのが最初にするべきことで、それが分かると解決の糸口になります。
プログラミングは様々な状況で、影響を受ける範囲も様々となり、発生するエラーも多種多様です。

想定していないコードの動きやエラーは、デバッグを仕込んで結果を観察します。その実行結果から、修正するべき箇所を特定していきましょう。
開発中は、仮定を立ててみて、デバッグを仕込んで実験をして、実験結果を観察して次の仮説を立てる、というサイクルの繰り返しです。

調査のコツとしては、一気に色々と試すのではなく、一つずつコードを書いてみてうまくいくかアプリを起動して確認をしてみてください。
エラーが発生する前の状況に戻して、次に可能な限りシンプルな実装を一つずつ、試してみるのと分かりやすいです。

次の動画では「iPhoneアプリ開発でエラーの原因を自分で調べよう!役立つデバック方法とprint文の活用」について解説しています。

■print文を用いてコンソールに出力

Swiftでは、print文を用いて、変数やコレクションの値をXcodeのデバッグコンソールで確認することができます。

SwiftUIの中では、メソッド、またはButtonのactionや、onApperのようなクロージャ内では、print文を利用できます。

ただし、基本的にはそれ以外のView内で利用することができません。

また、CanvasのLive Previewの機能ではprint文の出力は確認できません。

シミュレータを起動して確認する必要があります。まとめると下記の利用条件があります。

  •  SwiftUIのView内では利用できません。
  •  メソッド、またはButtonのactionや、onApperのようなクロージャ内では、print文を利用できます。
  •  シミュレータを起動して確認をします。

下記は、アプリ起動時に実行されるonAppearのクロージャ、Buttonのactionのクロージャ、関数内でprint文を出力しています。

このように、クロージャや関数内ではprint文を実行して、デバッグコンソールで値を確認することができます。

下記のように、クロージャや関数外でprint文を記述するとエラーが発生します。

SwiftUIのView内で print文でコンソールに出力

SwiftUIのView内では通常はprint文が利用できませんが、print文を定数か変数に代入すればprint文を有効にしてデバッグすることができます。

下記が実行した際の動きです。このようにViewの中でも、print文を定数に代入することで、コンソールに出力できることが確認できます。

この例では、print文を代入した定数や変数は、この場所以外では利用しないので「 _ 」を指定して名前を省略しています。

let 定数名 = print("デバッグ")

上記のように定数名を付けても動作しますが、Xcodeでは、定数の定義後に利用していない場合は、利用されていない旨の警告が出力されます。警告の目的は不要なコードの削除漏れを促すためです。そのため、定数名の省略記法の「_」を利用して警告が表示されないようにしています。

また、この観察で分かるのは、onAppear時のデバッグログより、「Viewでデバッグしたい!」のメッセージが先に出力されています。

このように、実行タイミングの順序も確認できるので便利です。

定数・配列の値を出力

文字列をprint文に出力をしてデバッグすることも可能ですが、定数の値を利用して出力することもできます。

また、下記のように繰り返し文でコレクションを取り出し、print出力を行うこともできます。

変数の値を出力

開発中は、変数の値を確認したい場合がよくあります。その場合は、下記のように変数をデバッグして、値の変化を確認することができます。

条件分岐や繰り返し文で、想定したように動かない場合は、このように変数の値を出力して確認を行い、うまく行っていない原因を調査します。

■デバッガーの利用

print文でも変数の値の変化を確認することができますが、Xcodeのデバッガーを利用してデバッグを行うことができます。

コードにブレークポイントと呼ばれるプログラムの実行を一時停止させる機能を利用して、好きなタイミングでデバッグを行うことができます。

下記のコードは、ボタンのタップで乱数を生成して、占いをするコードです。このサンプルコードを利用して、デバッガの利用方法を学びましょう。

Buttonがタップされて変数の変化が起きて、if文の分岐処理がどのように実行されるのかが確認できます。

Xcodeでの操作方法は、下記の操作動画を確認してください。

操作動画の解説をします。

エディタエリアで一時停止をしたい行をクリックして、ブレークポイントを設定します。

シミュレーターを立ち上げて、Buttonをタップするとブレークポイントで一時停止されています。

下記のように、デバッグエリアで、poコマンドの後に半角スペースを入れて、その後に調査したい変数を指定します。

po 変数名

po randomNumber

po fortuneMessage

poコマンドを利用することで、ブレークポイントを設定した時点の変数の値が確認できます。

また、ブレークポイント設定時には次のボタンを押すことで、プログラムを1行ずつ検証するなどの操作が行えます。


[Deactivate breakpoints]はブレークポイントの有効・無効を切り替えます。

❷ [Continue program execution]は、一時停止したプログラムを再開します。

[Step over]は、1 行ずつプログラムを実行します。

[Step into]はメソッドの中に入ります。

❺ [Step out]はメソッドから出ることができます。

❹ ❺で、ステップ実行を行えます。