ボクココ

サービス開発を成功させるまでの歩み

SwiftUI での プロパティオブサーバの使いどき

ども、@kimihom です。

f:id:cevid_cpp:20210821161803j:plain

引き続き iOS の開発をしているけども、その中でプロパティオブサーバについて実際の利用例を示しながら便利さについて記してみる。

fullScreenCover での画面切り替え

特定のタイミングで特定の別画面を表示させたい時に、fullScreenCover で表示することがある。

struct MyView: View {
    @EnvironmentObject var myViewModel: MyViewModel
    
    var body: some View {
        VStack {
            // ~~
        }
        .fullScreenCover(isPresented: $myViewModel.showScreen) {
            ScreenView()
        }
    }
}

上記の場合、MyViewModel の ViewModel 側で定義した showScreentrue, 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
        }
    }
}

showScreenhoge 変数の結果に常に左右されている場合、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 ではそこもしっかりと対応するために、今回の プロパティオブサーバ など、便利なものがあるなと感じることができた。

本を読んでるだけだと 「ふ〜ん、でもそれ知らなくてもよくね?」 な文法や記法がたくさんあるんだけど、それぞれ学びながら最適なところで最適に使っていけるよう 精進を続けるとしよう。

SwiftUI 徹底入門

SwiftUI 徹底入門

Amazon