バッテラのハローワールド研究室

エンジニア、プログラミングに関する情報を掲載中!

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

SwiftUI

はじめに

今日はSwiftUIのデバッグ方法について勉強していきます。

SwiftUIをやり始めて1ヶ月ぐらい経ったのですがViewが再描画されてるかが結構重要なことだと分かりました。

というのも、SwiftUIは手動でViewの再描画ができないため完全にシステム依存になります。

どうしたら再描画されるかが理解できるまでものすごく時間がかかるフレームワークだと思います。
(もちろん私も理解できていません)

そこで今回は再描画されたか分かるようにログを出す方法について共有したいと思います。

_printChangesを使いましょう

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

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

    // SomView

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

シミュレータで動作を確認

シミュレータを起動しましょう。残念ながらプレビューだとログは出ないようです。

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

再描画された時は↓のようなログ形式になります。これが表示されない場合は再描画されていないです。

XXXView: _xxxxxx changed.

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

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

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

なのでProperty Wrapperの使い方には慎重にならないといけないと思った次第です。。

おわりに

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

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

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

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