Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

// 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 を監視

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

Thank you !