Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Observationではじめる値監視
Search
akkiee76
February 07, 2024
Technology
4
4.6k
Observationではじめる値監視
「potatotips #86 iOS/Android開発Tips共有会」で発表した資料になります。
https://potatotips.connpass.com/event/307311/
akkiee76
February 07, 2024
Tweet
Share
More Decks by akkiee76
See All by akkiee76
Graph Art with Charts API – Beyond Data Visualization
akkie76
0
140
Meet the Translation API
akkie76
0
380
コードレビューで開発を加速させるAIコードレビュー
akkie76
1
610
Android Target SDK 35 (Android 15) 対応の概要
akkie76
0
5.5k
コードレビューを支援するAI技術の応用
akkie76
5
1.1k
オブジェクト指向コードレビューの新しいアプローチ
akkie76
3
9k
Jetpack Compose で Adaptive Layout に対応しよう
akkie76
0
890
TextField 表示スタイル変更の 有効活用例 5 選
akkie76
0
690
rememberUpdatedState の使いどころを考える
akkie76
0
560
Other Decks in Technology
See All in Technology
Connect 100+を支える技術
kanyamaguc
0
150
OPENLOGI Company Profile
hr01
0
67k
本が全く読めなかった過去の自分へ
genshun9
0
710
Amazon S3標準/ S3 Tables/S3 Express One Zoneを使ったログ分析
shigeruoda
5
590
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
26k
Amazon Bedrockで実現する 新たな学習体験
kzkmaeda
2
680
LangSmith×Webhook連携で実現するプロンプトドリブンCI/CD
sergicalsix
1
150
WordPressから ヘッドレスCMSへ! Storyblokへの移行プロセス
nyata
0
330
生成AI時代 文字コードを学ぶ意義を見出せるか?
hrsued
1
730
Zephyr RTOSを使った開発コンペに参加した件
iotengineer22
0
130
Should Our Project Join the CNCF? (Japanese Recap)
whywaita
PRO
0
290
生まれ変わった AWS Security Hub (Preview) を紹介 #reInforce_osaka / reInforce New Security Hub
masahirokawahara
0
360
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.1k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
720
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.5k
Automating Front-end Workflow
addyosmani
1370
200k
Scaling GitHub
holman
459
140k
Build The Right Thing And Hit Your Dates
maggiecrowley
36
2.8k
The Straight Up "How To Draw Better" Workshop
denniskardys
234
140k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.3k
How GitHub (no longer) Works
holman
314
140k
The Pragmatic Product Professional
lauravandoore
35
6.7k
Why Our Code Smells
bkeepers
PRO
337
57k
Transcript
©2024 RAKUS Co., Ltd. Observationではじめる値監視 potatotips #86 iOS/Android開発Tips共有会 2024/02/07 @akkiee76
自己紹介 • Akihiko Sato • Rakus Inc. • 楽楽精算 •
@akkiee76 / X 2
今日のテーマ Observation フレームワークの概要を紹介 3
Observation フレームワークとは? • Swift 5.9 から導入された新しい値監視のフレームワーク ◦ ハイパフォーマンスなデータバインディングが期待される ◦ iOS
17.0 以上で使用可能 4 https://developer.apple.com/documentation/observation
これまでの値監視のフレームワーク • KVO(Key-Value Observing) ◦ プロパティの変更を監視し、他のオブジェクトに通知するデザインパターン • Combine ◦ 変更値を宣言的に記述できる非同期処理のフレームワーク
5
なぜ Observation が登場したのか 🤔 6
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
Observation による値監視実装の基本 🛠 1. 値監視の基本ケース 2. 値監視の対象から外すケース 3. 値更新時に何らかの処理をするケース 8
1. 値監視の基本ケース 9
// User.swift @Observable class User { private(set) var nickName =
"" func updateNickName(_ newValue: String) { nickName = newValue } } 10 値を監視する class に @Observable マクロを宣言
// 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 を監視
Observable マクロを付与することで、 対象クラスのプロパティが監視可能に 💪 12
2. 値監視の対象から外すケース 13
// User.swift @Observable class User { @ObservationIgnored private(set) var nickName
= "" func updateNickName(_ newValue: String) { nickName = newValue } } 14 @ObservationIgnored マクロで 値監視の対象外に
ObservationIgnored マクロを付与することで、 対象プロパティを監視から外すことが可能 💪 15
3. 監視対象プロパティの更新時に 何らかの処理を行うケース 16
withObservationTracking func withObservationTracking<T>( _ apply: () -> T, onChange: @autoclosure
() -> () -> Void ) -> T withObservationTracking を使用することで、値更新時に任意の処理が可能 17 • apply closure ◦ 監視対象にアクセスすることでプロパティを監視対象にできる • onChange closure ◦ 対象プロパティが変更された場合、一度呼び出される https://developer.apple.com/documentation/observation/withobservationtracking(_:onchange:)
func addTracking() { withObservationTracking { print(user.nickName) } onChange: { self.showConfirmDialog()
} } func showConfirmDialog() { // user.nickNameをダイアログ表示 } 18 値監視の対象の プロパティにアクセス onChangeが一度だけ実行 継続的に値監視する場合は再帰処理が必要
まとめ Observation 基本的な使い方を紹介しました。 iOS 17 以上で使用が可能なので、実践導入は現実的ではありませんが、 今後のデファクトスタンダードになるでしょう。
Thank you !