Avatar
書いたクロージャーがautoclosureの自動クロージャーで包まれるからですね。
t_desudesu 1
7:33 AM
まぁどのみち最初の話通り、ただのStateだとインスタンスが毎回作られるのでinitの中身次第ではパフォーマンスに差が出そうですね。
7:36 AM
@Stateの場合、2回目以降に作られたインスタンスって本当に捨てられてるんですね。ためしにUUID持たせたら更新されるかと思ったらされませんでした。 import SwiftUI import Observation struct ContentView: View { @State var count = 0 var body: some View { VStack { Text(count.description) Button { count += 1 print("count: \(count)") } label: { Text("count") } ChildView() } } } struct ChildView: View { @State var viewModel = ChildViewModel() var body: some View { Text("child: \(viewModel.uuid)") } } @MainActor @Observable final class ChildViewModel { var uuid = UUID() init() { print("init \(uuid)") } deinit { print("deinit") } } (edited)
7:38 AM
ボタンを押すたびに異なるUUIDが作られているけれど画面上に表示されてるUUIDは変わらずでした。 init 89ABAE9C-B5DB-40F7-B710-AE95575C29D3 count: 1 init C4985631-EF43-4AF7-8684-999EE5CFD808 count: 2 init EE559DE9-F089-4EB2-AD93-CBDEC3645992 deinit count: 3 init 31DDF64E-71FB-475D-AE42-1D76FCDA9FBF deinit count: 4 init 65A0C8E2-2AA3-4BF5-B706-746587E5C9A3 deinit count: 5 init 24222547-C0AB-45ED-ABDD-9579D746C752 deinit