Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Observationではじめる値監視

akkie76
February 07, 2024

 Observationではじめる値監視

「potatotips #86 iOS/Android開発Tips共有会」で発表した資料になります。

https://potatotips.connpass.com/event/307311/

akkie76

February 07, 2024
Tweet

More Decks by akkie76

Other Decks in Technology

Transcript

  1. ©2024 RAKUS Co., Ltd.
    Observationではじめる値監視
    potatotips #86 iOS/Android開発Tips共有会
    2024/02/07
    @akkiee76

    View full-size slide

  2. 自己紹介
    ● Akihiko Sato
    ● Rakus Inc.
    ● 楽楽精算
    ● @akkiee76 / X
    2

    View full-size slide

  3. 今日のテーマ
    Observation フレームワークの概要を紹介
    3

    View full-size slide

  4. Observation フレームワークとは?
    ● Swift 5.9 から導入された新しい値監視のフレームワーク
    ○ ハイパフォーマンスなデータバインディングが期待される
    ○ iOS 17.0 以上で使用可能
    4
    https://developer.apple.com/documentation/observation

    View full-size slide

  5. これまでの値監視のフレームワーク
    ● KVO(Key-Value Observing)
    ○ プロパティの変更を監視し、他のオブジェクトに通知するデザインパターン
    ● Combine
    ○ 変更値を宣言的に記述できる非同期処理のフレームワーク
    5

    View full-size slide

  6. なぜ Observation が登場したのか 🤔
    6

    View full-size slide

  7. swift-evolution / 0395-observability.md
    ● KVO(Key-Value Observing)
    ○ NSObjectの継承、@Objc の宣言が必要
    ○ 内部的には文字列指定で扱われる(型安全性への懸念)
    ● Combine
    ○ 非 SwiftUI での使用での制約
    ○ @Published の宣言が開発者にとって冗長
    7
    https://github.com/apple/swift-evolution/blob/main/proposals/0395-observability.md

    View full-size slide

  8. Observation による値監視実装の基本 🛠
    1. 値監視の基本ケース
    2. 値監視の対象から外すケース
    3. 値更新時に何らかの処理をするケース
    8

    View full-size slide

  9. 1. 値監視の基本ケース
    9

    View full-size slide

  10. // User.swift
    @Observable
    class User {
    private(set) var nickName = ""
    func updateNickName(_ newValue: String) {
    nickName = newValue
    }
    }
    10
    値を監視する class に
    @Observable マクロを宣言

    View full-size slide

  11. // ContentView.swift
    struct ContentView: View {
    @State var text = ""
    @State var user = User()
    var body: some View {
    VStack {
    TextField("Enter text", text: $text, onEditingChanged: { _ in
    }, onCommit: {
    user.updateNickName(text)
    })
    .padding()
    Text(user.nickName)
    }
    }
    }
    11
    @State Property Wrapper で保持
    nickName を監視

    View full-size slide

  12. Observable マクロを付与することで、
    対象クラスのプロパティが監視可能に 💪
    12

    View full-size slide

  13. 2. 値監視の対象から外すケース
    13

    View full-size slide

  14. // User.swift
    @Observable
    class User {
    @ObservationIgnored
    private(set) var nickName = ""
    func updateNickName(_ newValue: String) {
    nickName = newValue
    }
    }
    14
    @ObservationIgnored マクロで
    値監視の対象外に

    View full-size slide

  15. ObservationIgnored マクロを付与することで、
    対象プロパティを監視から外すことが可能 💪
    15

    View full-size slide

  16. 3. 監視対象プロパティの更新時に
    何らかの処理を行うケース
    16

    View full-size slide

  17. withObservationTracking
    func withObservationTracking(
    _ apply: () -> T,
    onChange: @autoclosure () -> () -> Void
    ) -> T
    withObservationTracking を使用することで、値更新時に任意の処理が可能
    17
    ● apply closure
    ○ 監視対象にアクセスすることでプロパティを監視対象にできる
    ● onChange closure
    ○ 対象プロパティが変更された場合、一度呼び出される
    https://developer.apple.com/documentation/observation/withobservationtracking(_:onchange:)

    View full-size slide

  18. func addTracking() {
    withObservationTracking {
    print(user.nickName)
    } onChange: {
    self.showConfirmDialog()
    }
    }
    func showConfirmDialog() {
    // user.nickNameをダイアログ表示
    }
    18
    値監視の対象の
    プロパティにアクセス
    onChangeが一度だけ実行
    継続的に値監視する場合は再帰処理が必要

    View full-size slide

  19. まとめ
    Observation 基本的な使い方を紹介しました。
    iOS 17 以上で使用が可能なので、実践導入は現実的ではありませんが、
    今後のデファクトスタンダードになるでしょう。

    View full-size slide