Slide 1

Slide 1 text

最新技術をキャッチアップしたい ~ The Composable Architecture ~ 上條 栞汰

Slide 2

Slide 2 text

⾃⼰紹介 l かみじょー l 東洋⼤学総合情報学部2年 l Swift歴1年と半分 l SwiftSyntax⼊⾨したい @KantaSwift @kanta_Swift @kanta_Swift

Slide 3

Slide 3 text

最新技術ってわくわくしませんか?

Slide 4

Slide 4 text

iOS業界でトレンドとなっている技術のみなさん マルチモ ジュール The Composable Architecture Macro String Catalog SwiftSyntax

Slide 5

Slide 5 text

The Composable Architecture

Slide 6

Slide 6 text

The Composable Architectureとは ◎特徴 1. アプリの状態を1つのStateで管理できる 2. Stateの変更がReducer内のみに強制できる 3. テストがしやすい! => version1.0.0が最近(2ヶ⽉前)出た! ※現在: version 1.2.0 => Pointfreeが作ったライブラリ

Slide 7

Slide 7 text

概念 nState Management nComposition nTesting nSide Effects ある画⾯での状態の変更を別の画⾯で すぐに監視することができる⽅法 ⼤きな機能を細く分割し、それぞれを簡単に繋げて 機能を形成することができる 副作⽤を分離し、可能な限りテストができる 様々なケースのテストができる • 多くのComponentで構成された機能の統合テスト • 副作⽤がアプリケーションに与える影響のテスト

Slide 8

Slide 8 text

Reducer Action State Store Effect View 主要構成

Slide 9

Slide 9 text

Reducer Action State Store Effect View 主要構成 Button Tap!

Slide 10

Slide 10 text

Reducer Action State Store Effect View 主要構成 Button Tap! count 1up

Slide 11

Slide 11 text

Reducer Action State Store Effect View 主要構成 Button Tap! count 1up Viewに反映!

Slide 12

Slide 12 text

Reducer Action State Store Effect View 主要構成 Button Tap! count 1up Viewに反映! レスポンス リクエスト

Slide 13

Slide 13 text

かなり学習がしやすい!

Slide 14

Slide 14 text

⾊々ソースコードを⾒ていく

Slide 15

Slide 15 text

このコードどういうこと? 🧐

Slide 16

Slide 16 text

Case1 ~チュートリアルにて~ え、なんでcountにアクセスできんの?

Slide 17

Slide 17 text

Case2 ~サンプルアプリにて~ KeyPathではない何かがいる…

Slide 18

Slide 18 text

Case3 ~サンプルアプリにて~ 依存を注⼊してるっぽい??

Slide 19

Slide 19 text

TCAではめちゃよく使われている技術であり基本的なこと

Slide 20

Slide 20 text

これらの事例をちゃんと理解して TCAを利⽤したい

Slide 21

Slide 21 text

Case1: ViewStoreがなぜcountを知っているのか

Slide 22

Slide 22 text

結論 Key Path Member Lookupを利⽤してアクセスしているため。

Slide 23

Slide 23 text

Key Path Member Lookupとは =>Dynamic Member Lookup属性をKey Pathに基づいて拡張されたもの • 存在しないプロパティにアクセスすることができる • サジェストは出てこない… • 存在しないプロパティにアクセスすることができない • サジェストは出てくる

Slide 24

Slide 24 text

ViewStoreの内部実装 => ViewStateをKeyPathのRootに設定することで、viewStoreからアクセスできる ※CurrentValueRelayはCombineのPublisher

Slide 25

Slide 25 text

ViewStoreの内部実装 => Observe: 必要なState(データ)だけを監視する => removeDuplicates: 同じState(データ)が来たらviewの再描画を抑制する

Slide 26

Slide 26 text

Case2: きみは⼀体なにものなの??

Slide 27

Slide 27 text

結論 swift-case-pathsというライブラリの機能

Slide 28

Slide 28 text

KeyPath 🙆 🙅 => Enum型でKeyPathを利⽤することはそもそもできない

Slide 29

Slide 29 text

swift-case-pathsとは => Enum型をKeyPathのように使えるようにしたもの!

Slide 30

Slide 30 text

swift-case-paths内部実装 => caseがクロージャーで定義されている => Operatorの定義🔽

Slide 31

Slide 31 text

使⽤例: swift-case-paths • embed: associcatedValueを追加することができる • extract: associatedValueを取り出すことができる Point!! 親から⼦のアクションを とってくることができる!

Slide 32

Slide 32 text

Enumの性質 => caseをクロージャーで表すことができる! ※associatedValueがあるcaseのみ

Slide 33

Slide 33 text

swift-case-pathsがなぜTCAで使われるのか 親Reducer ⼦Reducer 親と⼦の統合において • Scope • Reducer.ifLet • Reducer.forEach …etc

Slide 34

Slide 34 text

Tip: swift-case-paths内部実装 associatedValueがない場合も考慮されている

Slide 35

Slide 35 text

Case3 ~サンプルアプリにて~ 依存を注⼊してるっぽい??

Slide 36

Slide 36 text

結論 swift-dependenciesというライブラリの機能

Slide 37

Slide 37 text

swift-dependenciesとは => DIを簡単に実装することができるライブラリ! => Live、Test、Previewの3つの場合で⾃動的に切り替えてくれる! DependenciesValue DependencyKey (TestDependencyKey) Keyを作成! Keyを登録

Slide 38

Slide 38 text

実装例: TestDependencyKeyの作成と登録 TestDependencyKeyでは、testValueの実装が求められる

Slide 39

Slide 39 text

実装例: DependencyKeyの作成と登録 DependencyKeyでは、liveValueの実装が求められる

Slide 40

Slide 40 text

実装例: 登録したDependencyの呼び出し

Slide 41

Slide 41 text

疑問: なぜ呼び出すことができるのか => KeyPathにDependencyValueが設定されている!

Slide 42

Slide 42 text

疑問: なぜswift-dependenciesが良いのか • 数珠つなぎでinitの引数の数が膨⼤になる • 数珠つなぎであるが故に、⼀部分だけmock等に差し替えることができない ◎既存DI⽅法における問題 これらの問題を全て解決してくれる!!

Slide 43

Slide 43 text

PointFreeが出しているライブラリの皆さん swift-case- paths swift- depedencies swift- snapshot- testing swift- identified- collections swiftui- navigation 今回紹介したライブラリも最初の基礎的な部分!

Slide 44

Slide 44 text

参考⽂献 ご清聴ありがとうございました!! • https://github.com/apple/swift-evolution/blob/main/proposals/0195-dynamic- member-lookup.md • https://github.com/apple/swift-evolution/blob/main/proposals/0252-keypath- dynamic-member-lookup.md • https://zenn.dev/kalupas226/articles/25ec066246473e • https://github.com/pointfreeco/swift-case-paths • https://github.com/pointfreeco/swift-dependencies • https://github.com/pointfreeco/swift-composable-architecture