View の更新トリガーを調べるために _printChanges() を利用する。
#24
YusukeHosonuma
started this conversation in
Ideas
Replies: 1 comment
-
|
idメソッドで値をセットするとViewの識別子が変化するとReferenceにはあります。Viewの識別子(the identity of the view)はなにか?をNew Bingに尋ねるとView階層内での一意な値で変更されると新しいViewだとみなされるのだそうです。Viewの再描画は
によって起こるので、idメソッドは強制再描画を起こすために使えそうです。また、@identityの表記はView階層に変化により再描画が行われた事を示しているようです。 |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Overview
SwiftUI 3.0 において、開発者向けのデバッグ機能として
_printChanges()というメソッドが導入された。これは View の更新をトリガーした値の変更などを調べることができるもので、
body関数の先頭で以下のように記述して利用する。上記を初期表示し、
x++ボタンをタップすると、コンソールには以下の内容が出力される。このように対象の View が更新されたタイミングで、そのトリガーとなった値などが出力される。このケースでは
_x changedと出力されており、@Stateの内部値(wrapped-value)が更新契機となっていることが分かる(@selfや@identityはこのあと説明する)。これは意図せず大量に更新が走っている際に、その原因を突き止めるのに役立つはずだ。
この API は(頭に
_がついていることからも察せられるとおり)プライベートAPI という位置づけになっている。そのため、Apple からのドキュメントは提供されていないが、Xcode 上からヘルプを表示することで確認できる。この説明内容から
@selfや@identityが意味するところも分かる。@self@selfは View 自体が更新されたことを意味する。上記を初期表示してから
x++ボタンをタップすると、以下のように出力される。これは
ContentViewのxが更新され、それによってNumberViewが再生成(@self changed)されたことを表す。@identity@identityは View の(差分計算のための)ID 自体が変化したことを意味する。上記を初期表示してから
viewID++ボタンをタップすると、以下のように出力される。他の値も出力されていて分かりづらいが、初期表示によって ID が振られたことによって
@identityが出力され、その後の ID 変更によって再び@identityが出力されたことが読み取れるはずだ。ここで
XViewにわざわざ@State var x = 0を用意していることに留意して欲しい。これはその View に保持する状態がなければ、SwiftUI はそもそも View の変更を検知する必要がないため、差分計算のためにXViewを View ツリーに含める必要がなくなるためだ(おそらく)。そのため
@State var x = 0を取り除くと、@self changed.としか出力されなくなる。Discussion
ここまで解説した
@selfおよび@identityについては、私の憶測も多分に含まれる。おそらく、この理解で正しいと思うが、間違いがありそうであれば指摘して欲しい。Why not?
プライベート API という位置づけであるため、このコードを含めた状態でアプリを提出するとリジェクトされる可能性があるので注意すること。
Reference
Beta Was this translation helpful? Give feedback.
All reactions