バッテラが如く

プログラミングしましょ!

【SwiftUI】Viewが再描画されているか確認する方法 (_printChanges ログ確認)

この記事の情報は次のバージョンで動作確認しています。

  • MacOS Monterey (12.1)
  • Xcode (v13.3.1)
  • SwiftUI

    はじめに

    今日はSwiftUIデバッグ方法についてです。

    SwiftUIはViewの再描画を強制することができません。

    なので再描画されたかを確認することがSwiftUIの基本ムーブになります。

    FlutterならsetStateで囲めば再描画走りますが、こういうのがSwiftUIにはありません(泣)

    再描画をログで確認する方法があったので、それを共有したいと思います。

    _printChangesを使う

    bodyの直下でSelf._printChanges()と書きます。

        var body: some View {
            let _ = Self._printChanges()
    
        // SomView
    

    let _としているのはbodyの中だとこういう書き方しないとエラーになるためです。 (print使う場合も同様です)

    これでこのViewで再描画走るとログが出るようになります。

    残念ながらプレビューだとログは出ないので、*シミュレータを起動してください。

    _printChangesを使っているViewに遷移するとコンソールウィンドウに↓のようなログが表示されます。

    再描画された時は↓のようなログが出ます。

    XXXView: _xxxxxx changed.

    表示されない場合は再描画されていないことになりますね。

    xxxxに変数名が表示(複数)されますが、表示された変数を使ってる表示箇所は正しく更新されてると思います。

    逆に変数名が表示されていない場合は前回の値が表示されてると思います
    (再描画されないケースはほぼこれで分かる)

    以上が再描画の確認方法でした。

    すごく簡単にできるので再描画に困った時は使ってみてください。

    再描画されないケースとは?

    経験上ですが再描画されない時は@がつく変数を使った時でした。

    なのでPropertyWrapper(@のこと)の理解が重要ですね。

    といってもこれがムズイですがね。。

    おわりに

    いやぁー_printChangesはまじで使えると思いました。

    これをヒントにしていけばなんとなく再描画されない原因が追えます。

    最後まで見ていただきヘペトナス!

    読者登録・Twitterのフォローもお願いします。