SwiftUIでは値の監視が楽チンになった

こんにちは。ママさんエンジニアのトモヨです。
UIKitでは表示する情報がが変わった時にViewを更新しなければならない処理が必要でした。

label.text = "変更したよ"
view.layoutIfNeeded() //明示的に画面の変更を促す


@State

SwiftUIのViewはStruct(構造体)であるため値の保存ができない。
@Stateを付属したプロパティはメモリ管理がフレームワークに移譲される
プロパティは常に監視され、変更があった場合に宣言されたViewが再描画される

    @State var isShow: Bool = true
    
    var body: some View {
        Toggle(isOn: $isShow, label: {
            Text("Favorite")
        })
    }

@ObservedObject

@stateで複数管理するプロパティが増えた場合、管理が大変になるのでひとまとめに管理ができます。ObservableObjectに準拠したクラスが必要です。
また、子のクラスに値を引き渡すことができます。(別記事で詳しく書く予定です。)

class ToggleProperty : ObservableObject {
    @Published var isShow = true
    @Published var value = 0.0
}

struct ContentView: View {
    @ObservedObject var property: ToggleProperty
    
    var body: some View {
        Toggle(isOn: $property.isShow, label: {
            Text("Favorite")
        })
        Slider(value: $property.value, in: 0...100)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(property: ToggleProperty())
    }
}

今まではアプリが起動中はずっと保持し続けるプロパティが保持され続けて、後々メモリ逼迫で困るという事象がありました。
この辺りの問題も解決できるかもしれません。まだ深く使い込んでいないため、いろいろなパターンでのチャレンジが必要です。


この記事が気に入ったらサポートをしてみませんか?