ども、@kimihom です。
引き続き iOS の開発をしているけども、その中でプロパティオブサーバについて実際の利用例を示しながら便利さについて記してみる。
fullScreenCover での画面切り替え
特定のタイミングで特定の別画面を表示させたい時に、fullScreenCover
で表示することがある。
struct MyView: View { @EnvironmentObject var myViewModel: MyViewModel var body: some View { VStack { // ~~ } .fullScreenCover(isPresented: $myViewModel.showScreen) { ScreenView() } } }
上記の場合、MyViewModel
の ViewModel 側で定義した showScreen
が true
, false
によって、 ScreenView
を表示させるような実装になっている。
この fullScreenCover
を出すか出さないかは Bool である必要があって、そのためにわざわざ必要な時に true
を指定するのが面倒なケースがある。
class MyViewModel: NSObject, ObservableObject { @Published var showScreen = false var hoge: String = "test" func some1() { if hoge == "something" { showScreen = true } } func some2() { if hoge == "test" { showScreen = false } } }
showScreen
が hoge
変数の結果に常に左右されている場合、hoge
の変更のたびに showScreen
をセットする必要が出てくる。
そこでプロパティオブサーバーの登場だ。以下のように書ける。
class MyViewModel: NSObject, ObservableObject { @Published var showScreen = false var hoge: String = "test" { didSet { // Swift プロパティオブサーバ。hoge の値が変わるたびに呼ばれる self.showScreen = (self.hoge == "something") } } func some1() { } func some2() { } }
showScreen
の値は hoge
の設定によって左右されるようになり、UI 表示のためだけの無駄なコードを減らすことができる。
終わりに
SwiftUI での 変数と ビューの 同期によって、とても簡単に UI の切り替えができるようになっている。 ただ、そのために変数の型と SwiftUI で求められる型 (今回だと Bool) に合わせる必要が出てくる。 SwiftUI ではそこもしっかりと対応するために、今回の プロパティオブサーバ など、便利なものがあるなと感じることができた。
本を読んでるだけだと 「ふ〜ん、でもそれ知らなくてもよくね?」 な文法や記法がたくさんあるんだけど、それぞれ学びながら最適なところで最適に使っていけるよう 精進を続けるとしよう。