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. 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
  2. // User.swift @Observable class User { private(set) var nickName =

    "" func updateNickName(_ newValue: String) { nickName = newValue } } 10 値を監視する class に @Observable マクロを宣言
  3. // 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 を監視
  4. // User.swift @Observable class User { @ObservationIgnored private(set) var nickName

    = "" func updateNickName(_ newValue: String) { nickName = newValue } } 14 @ObservationIgnored マクロで 値監視の対象外に
  5. withObservationTracking func withObservationTracking<T>( _ apply: () -> T, onChange: @autoclosure

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

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