SwiftのObservationフレームワークによる値の監視

9.5K Views

December 13, 23

スライド概要

YUMEMI.grow Mobile #9 - connpass
https://yumemi.connpass.com/event/302462/

SwiftのObservationフレームワークによる値の監視 #Swift - Qiita
https://qiita.com/usamik26/items/6544879e3aa8343b709f

profile-image

https://usami-k.github.io/

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Swiftの Observationフレームワークによる 値の監視 宇佐見公輔 / 株式会社ゆめみ 2023-12-13 SwiftのObservationフレームワークによる値の監視 1

2.

自己紹介 宇佐見公輔(うさみこうすけ) 株式会社ゆめみ / iOSテックリード SwiftのObservationフレームワークによる値の監視 2

3.

Observationフレームワーク Swiftで値の変更を監視するためのフレームワーク データバインディングの実現 とくにSwiftUIでの利用を想定 Swift 5.9で追加された iOS 17など最新OSでのみ動作する 将来のデファクトスタンダード SwiftのObservationフレームワークによる値の監視 3

4.

Swiftにおける値の変更の監視 KVO(Key-Value Observing) Objective-Cからの機能 ObservableObject Combineフレームワークの機能 @Observable Observationフレームワークの機能 SwiftのObservationフレームワークによる値の監視 4

5.

@Observable Swift 5.9で追加されたマクロ機能で実現 @Observable final class Model { var value: Int = 0 } クラスに @Observable をつけると、そのクラスが監視可能になる SwiftのObservationフレームワークによる値の監視 5

6.

withObservationTracking final class ViewController: UIViewController { private let model = Model() private func tracking() { withObservationTracking { [weak self] in guard let self else { return } print("value: \(model.value)") } onChange: { print("onChange") } } } SwiftのObservationフレームワークによる値の監視 6

7.

変更の監視を開始する withObservationTracking { ... ... print("value: \(model.value)") } onChange: { ... } のクロージャで監視対象が決まる を参照 → の値が監視対象となる withObservationTracking model.value model.value SwiftのObservationフレームワークによる値の監視 7

8.

変更が通知される withObservationTracking { ... ... } onChange: { print("onChange") } model.value の値が変更されると SwiftのObservationフレームワークによる値の監視 onChange クロージャが呼ばれる 8

9.

動作の確認 tracking() を呼び出すと print("value: ...") が呼ばれる value: 0 model.value の値を変更すると print("onChange") が呼ばれる onChange なお、この通知は1回だけ来る SwiftのObservationフレームワークによる値の監視 9

10.

監視を継続する private func tracking() { withObservationTracking { ... ... } onChange: { Task { @MainActor [weak self] in guard let self else { return } tracking() } } } 再帰的に呼び出すことで、変更の監視を継続できる SwiftのObservationフレームワークによる値の監視 10

11.

UIKitでの利用例 private func tracking() { withObservationTracking { [weak self] in guard let self else { return } label.text = "value: \(model.value)" } onChange: { Task { @MainActor [weak self] in guard let self else { return } tracking() } } } SwiftのObservationフレームワークによる値の監視 11

12.

SwiftUIの場合 struct MyView: View { var model = Model() var body: some View { Text(model.value) } } これだけで継続的に値の変更を監視できる 内で参照されているプロパティが監視対象になる の記述は不要 body withObservationTracking SwiftのObservationフレームワークによる値の監視 12

13.

不要な監視は発生しない @Observable final class Model { var value1: Int = 0 var value2: Int = 0 } struct MyView: View { var model = Model() var body: some View { Text(model.value1) // value2 } の変更では再描画されない } SwiftのObservationフレームワークによる値の監視 13

14.

コレクションの監視 struct LibraryView: View { @State private var books = [Book(), Book(), Book()] var body: some View { List(books) { book in Text(book.title) } } } books への要素の追加や削除を監視してViewを更新できる の変更では、該当Viewだけが更新される book.title SwiftのObservationフレームワークによる値の監視 14

15.

Observableフレームワークの制約 構造体には をつけられない 値型(構造体)では使えず、参照型(クラス)で使える Swiftは構造体の値変更を監視するようには設計されてない バックポートには対応しない 古いバージョンのSwiftUIを対応させるのが難しい @Observable SwiftのObservationフレームワークによる値の監視 15

16.

おわりに Observationは既存の方法よりもシンプルで効率的 SwiftUIとの相性が良い 古いOSで使えないのでまだ採用できないが、将来のスタンダード SwiftのObservationフレームワークによる値の監視 16