onAppear
で create して onDisappear
で release したいようなものってどうやって保持するのがいいですか?import SwiftUI struct ContentView: View { var body: some View { NavigationView { FirstView() } } } struct FirstView: View { var body: some View { return NavigationLink(destination: SecondView()) { Text("Go") } .onAppear { // ここで create } .onDisappear { // ここで release } } } struct SecondView: View { var body: some View { Text("Second") } }
FirstView
のプロパティに Box
的なクラスのインスタンスを保持しておいて、 onAppear
で create されたインスタンスを Box
に格納して、その Box
を介して onDisappear
で release ?FirstView
がコンポーネント的な View
で、親 View
の body
が頻繁に再実行されたときにうまく動くか心配。struct FirstView: View { var box = Box<Foo>() var body: some View { NavigationLink(destination: SecondView()) { Text("Go") } .onAppear { self.box.value = Foo() } .onDisappear { self.box.value?.release() self.box.value = nil } } }
みたいな。 (edited)struct ContentView: View { @State var count: Int = 0 var body: some View { NavigationView { VStack { Stepper(count.description, value: $count) .frame(maxWidth: 160) FirstView() } } } }
Stepper
の値を増減させる度に body
が再実行されて FirstView
の box
が再生成されるから。box
の代わりに struct FirstView: View { // var box = Box<Foo>() @State var foo: Foo?
として保持させる裏技もあるけど、 @State
のようなライフサイクルがほしいだけで、変更検知(して body
再実行)はいらない・・・。@State
みたいな Property Wrapper を作ればいいのかな・・・。