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

SwiftUIのデータ管理

53e2d354b3299d64a54af680865516d5?s=47 Sato Takeshi
December 09, 2020

 SwiftUIのデータ管理

集まれSwift好き!Swift愛好会 vol.56 @ オンライン
発表資料
https://love-swift.connpass.com/event/196031/

「SwiftUI開発レシピ」はこちらから
https://nextpublishing.jp/book/12491.html

サンプルコード
https://github.com/SatoTakeshiX/SwiftUICatalog/tree/master/
https://github.com/SatoTakeshiX/SwiftUICatalog/tree/master/

53e2d354b3299d64a54af680865516d5?s=128

Sato Takeshi

December 09, 2020
Tweet

Transcript

  1. SwiftUIのデータ管理 2020 年 12 月 9 日 佐藤タケシ 集まれSwift好き!Swift愛好会 vol.56

    @ オンライン
  2. Who am I • Name • 佐藤タケシ(さとうたけし) • Company •

    Merpay, Inc.(2019/01 ~) • Role • Software Engineer (iOS) • Account • Twitter: @hatakenokakashi • Facebook: 佐藤剛士 • GitHub: SatoTakeshiX
  3. • SwiftUIを始める最適な一冊 • SwiftUIの基礎を徹底解説 ◦ レイアウトシステム ◦ 座標空間 ◦ データ管理

    ◦ UIコンポーネント • 実践的なサンプルアプリ ◦ GitHub API ◦ お絵かきアプリ ◦ 写真フィルターアプリ • iOS 14対応 ◦ LazyVStack、LazyVGrid、 WidgetKit、@StateObjectなど 「SwiftUI開発レシピ amazon」で検 索!
  4. SwiftUIのデータ管理

  5. @State @Binding @Environment @ObservedObject @StateObject @EnvironmentObject @SceneStorage @AppStorage

  6. Single Source of Truth

  7. Single Source of Truth • 情報システムにおいて、データの更新は一か所に限定 し、他のシステムからは参照のみに留める考え方 仕様書のマスターは〇〇で管理しています。 他ファイルへのコピーは禁止です。

  8. UIKitでよくある問題 Switchボタンのオンオフに連動させてTextを更新したい

  9. UIKitでよくある問題 Switchボタンのオンオフに連動させてTextを更新したい データの発生源が2つある

  10. UIKitでよくある問題 Switchボタンのオンオフに連動させてTextを更新したい 同期する処理が必要

  11. SwiftUIでSingle Source of Truth @Stateを使う

  12. SwiftUIでSingle Source of Truth @Stateを使う データの発生源は1つのみ

  13. SwiftUIでSingle Source of Truth $をつけるとBinding型へ変更できる (@StateのprojectedValue) バインディングする

  14. SwiftUIでSingle Source of Truth ToggleViewがisOnを更新するとisOnを参照しているTextが 自動的に更新される 値が更新されるとSwiftUIが Viewを更新する

  15. バグが少ないコードがかんたんに実装できる!

  16. SwiftUIで使える データ管理の PropertyWrapper

  17. データ管理のProperty Wrapper利用方針 • データはなにか? ◦ 値型のデータ ◦ 参照型のデータ • データをどのように処理するか?

    ◦ 読み込みだけ ◦ 更新する • データはどこからくるか? ◦ View自身から ◦ 親Viewから ◦ 環境から
  18. プロパティ • 値型データ • 読み込みのみ行う • データの出どころはView自身でも親ViewからでもOK

  19. None
  20. @State • 値型データ • データを更新する • データの出どころはView自身から ◦ 他からアクセスできないようにprivateをつけるといい

  21. None
  22. @Binding • 値型データ • データを更新する • データの出どころは親Viewなど外から渡される

  23. None
  24. @Environment • Viewの環境値を読み取ることができる • どんな値があるかはEnvironmentValuesに定義 ◦ スクリーン解像度 ◦ 言語設定 ◦

    アプリ起動状態などなど • ViewからはKeyPathを指定して読み込む
  25. None
  26. ObservableObjectプロトコル • SwiftUIが参照型データオブジェクトを監視できるようにす るプロトコル • 下記PropertyWrapperを使うときにはクラスに準拠が必 要 ◦ @StateObject ◦

    @ObservedObject ◦ @EnvironmentObject
  27. @StateObject • 参照型データオブジェクト • データの出どころはView自身 ◦ privateをつけるとよい • データオブジェクトのライフサイクルはViewが表示してか ら非表示になるまで

  28. @ObservedObject • 参照型データオブジェクト • 親Viewから渡されるときに使うと良い • データオブジェクトのライフサイクルはViewのbodyが更 新されるまで

  29. @StateObjectと @ObservedObject の違い

  30. None
  31. View自身でデータモデ ルを保持している

  32. None
  33. View自身でデータモデ ルを保持している

  34. None
  35. ボタンタップすると 親Viewのプロパティが更 新する。 すると親Viewのbodyが更 新される

  36. 子Viewとして配置

  37. None
  38. @ObservedObjectは親Viewから渡す時に使う

  39. @EnvironmentObject • 参照型データオブジェクト • 親Viewに.environmentObject修飾子でデータオブジェ クトを渡すと子孫Viewがデータにアクセスできる

  40. None
  41. None
  42. 親Viewに .environmentObject

  43. 使いたい子孫Viewに @EnvironmentObject

  44. .environmentObject忘れでランタイムエラー になるので注意

  45. @SceneStorageと@AppStorage @SceneStorage • 値型データ • macOS、iPadOSで複数ウィンド ウのシーンごとにデータを保存 する • データはシステムが管理

    • シーン破棄でデータ破棄 @AppStorage • 値型データ • アプリがアンインストールされる まで保存 • 保存先はUserDefault
  46. Senceとは? • macOS, iPadOSの複数ウィンドウ • 各ウィンドウは別のメモリ空間

  47. None
  48. Key名を指定する

  49. これがValueになる

  50. SwiftUI のデータ管理フローチャート

  51. Sample Code • https://github.com/SatoTakeshiX/SwiftUICatalog/tr ee/master/ • https://github.com/SatoTakeshiX/SwiftUICatalog/tr ee/master/

  52. • SwiftUIを始める最適な一冊 • SwiftUIの基礎を徹底解説 ◦ レイアウトシステム ◦ 座標空間 ◦ データ管理

    ◦ UIコンポーネント • 実践的なアプリサンプル ◦ GitHub API ◦ お絵かきアプリ ◦ 写真フィルターアプリ • iOS 14対応 ◦ LazyVStack、LazyVGrid、 WidgetKit、@StateObjectなど 「SwiftUI開発レシピ amazon」で検 索!
  53. 豊富なサンプル アプリ • GitHubリポジトリー検索 • お絵かきアプリ • 写真フィルターアプリ • TodoアプリをWidget対応

    「SwiftUI開発レシピ amazon」で検 索!