Slide 1

Slide 1 text

TCA v0.19.0͔Βͷ SwitchStore/CaseLet͕ྑ͍ QPUBUPUJQT @yimajo ͞Β͹͢΂ͯͷ*G-FU4UPSFʹΑΔը໘දࣔ੾Γସ͑

Slide 2

Slide 2 text

ࣗݾ঺հ

Slide 3

Slide 3 text

w ిࢠॻ੶$PNCJOFΨΠυϒοΫΛ ॻ͖·ͨ͠ͷͰങ͍ͬͯͩ͘͞ w IUUQTTXJGUCPPUIQN w 5$"Λ࢓ࣄͰ΍ͬͯͯɺ΋ͬͱ஌ Γ͍ͨͱ͔ɺ৽͘͠΍͖͍ͬͯͨͱ ͍͏૊৫ͷਓ͸!ZJNBKP·Ͱ%. ͔ϝʔϧΛ͍ͯͩ͘͠͞

Slide 4

Slide 4 text

ຊ୊

Slide 5

Slide 5 text

Effect View Store DI Environment TCA ( The Composable Architecture )ͱ͸ w J04ΞϓϦ։ൃͷͨΊͷ3FEVY෩ ຯͳ044 w "QQMFͷެࣜϦΞΫςΟϒϓϩά ϥϛϯάϑϨʔϜϫʔΫͰ͋Δ $PNCJOFΛར༻͍ͯ͠Δ Reducerʢؔ਺ʣ State Action Combine @Published Combine Publisher

Slide 6

Slide 6 text

v0.19.0 w FOVNͳ4UBUFʹରԠ͢ΔDBTFQBUIͷ 3FEVDFSQVMMCBDL͕௥Ճ w FOVNͳ4UBUFΛݸʑͷ4UBUFʹม׵͢Δ 4XJUDI4UPSFͷ௥Ճ w & ff FDUUJNFS͕DBODFM*O'MJHIUUSVFΛݺͼग़ͤΔΑ ͏ʹͳΓɺࣗಈతʹDBODFMMBCMFJE͕ಉ͡ͳΒ DBODFMͰ͖Δɻ w 'PS&BDI4UPSF͕վྑ

Slide 7

Slide 7 text

v0.19.0ͷ SwichStoreͱCaseLetʹ͍ͭͯ ExampleͷTicTacToeͰઆ໌

Slide 8

Slide 8 text

-PHJO 7JFX /FX (BNF 7JFX ىಈ ϩάΠϯ׬ྃ TicTacToeʢ3໨ฒ΂ʣήʔϜ

Slide 9

Slide 9 text

public enum AppState: Equatable { case login(LoginState) case newGame(NewGameState) public init() { self = .login(.init()) } } public struct AppState: Equatable { public var login: LoginState? = LoginState() public var newGame: NewGameState? public init() {} } public var body: some View { SwitchStore(self.store) { CaseLet( state: /AppState.login, action: AppAction.login ) { store in NavigationView { LoginView(store: store) } .navigationViewStyle(StackNavigationViewStyle()) } CaseLet( state: /AppState.newGame, action: AppAction.newGame ) { store in NavigationView { NewGameView(store: store) } .navigationViewStyle(StackNavigationViewStyle()) } } @ViewBuilder public var body: some View { IfLetStore( self.store.scope(state: \.login, action: AppAction.login) ) { store in NavigationView { LoginView(store: store) } .navigationViewStyle(StackNavigationViewStyle()) } IfLetStore( self.store.scope(state: \.newGame, action: AppAction.newGame) ) { store in NavigationView { NewGameView(store: store) } .navigationViewStyle(StackNavigationViewStyle()) } } Ҏલͷ΍Γํ 4XJUDI4UPSF$BTF-FUͰͷ΍Γํ 4XJGU6*7JFX 4XJGU6*7JFX 4UBUF 4UBUF

Slide 10

Slide 10 text

SwitchStore/CaseLet ͸ case͕໢ཏ͞Εͯͳ͚Ε͹ Τϥʔը໘Λදࣔͯ͘͠ΕΔ

Slide 11

Slide 11 text

SwitUI.View্Ͱ CaseLetͰ໢ཏͰ͖͍ͯ ͳ͍caseʹͳͬͨͱ͖ ਅͬ੺ͳը໘Ͱ $BTF-FUهࡌ͢Δ͔%FGBVMUΛ࢖͑ ͱܯࠂ͞ΕΔ

Slide 12

Slide 12 text

public var body: some View { SwitchStore(self.store) { CaseLet( state: /AppState.login, action: AppAction.login ) { store in NavigationView { LoginView(store: store) } .navigationViewStyle(StackNavigationViewStyle()) } CaseLet( state: /AppState.newGame, action: AppAction.newGame ) { store in NavigationView { NewGameView(store: store) } .navigationViewStyle(StackNavigationViewStyle()) } Default { Text(“ະ࣮૷: ͋ͱͰ͍͍ײ͡ʹCaseLetॻ͘”) } } 4XJGU6*7JFX DefaultΛ࢖ͬͯΈΔྫ %FGBVMU͸։ൃ࣌͘Β͍ʹ࢖ͬͯجຊతʹ͸$BTF-FUͰ໢ཏ͠Α͏ public enum AppState: Equatable { case login(LoginState) case newGame(NewGameState) case foo(FooState) public init() { self = .login(.init()) } } 4UBUF

Slide 13

Slide 13 text

SwitchStore/CaseLetͷ Ԡ༻Λߟ͑ͯΈΔ

Slide 14

Slide 14 text

લఏ ϩάΠϯը໘͸ ϩάΠϯࡁΈͳΒ දࣔ͠ͳ͍ -PHJO 7JFX /FX (BNF 7JFX ϩάΠϯ൑ఆ ͯ͠ ϩάΠϯͯͨ͠Β NewGameView ىಈ

Slide 15

Slide 15 text

-PHJO 7JFX /FX (BNF 7JFX ىಈ public enum AppState: Equatable { case launch(LaunchState) case login(LoginState) case newGame(NewGameState) public init() { self = .launch(.init()) } } -BVODI 7JFX ϩάΠϯ ͯ͠ͳ͚Ε͹ LoginView ϩάΠϯͯ͠Ε͹ NewGameView Ԡ༻ྫ1 LaunchViewͰΞχϝʔγϣϯͱ͔Ͱ͖Δ

Slide 16

Slide 16 text

ىಈ public struct AppState: Equatable { enum Scene: Equatable { case login(LoginState) case newGame(NewGameState) } var scene: Scene var flag: Bool // ڞ௨ͳԿ͔ public init( scene: Scene = .loginCore(.init()) flag: Bool = false ) { self.scene = scene self.flag = flag } } 4UBUF -PHJO 7JFX /FX (BNF 7JFX ϩάΠϯ൑ఆ ͯ͠ NewGameView Ԡ༻ྫ2 ୹ॴ: CathPathͷ࢓༷Λཧղ͠ͳ͍ͱೲಘͰ͖ͳ͍΍ΓํʹͳΔ

Slide 17

Slide 17 text

ىಈ public struct RootState: Equatable { var appCore: AppCoreState var flag: Bool // ڞ௨ͳԿ͔ public init( appCore: AppCoreState = .loginState(.init()) flag: Bool = false ) { self.appCore = appCore self.flag = flag } } let reducer = Reducer.combine( appCoreReducer( // … ), Reducer { // … } ) 4UBUF -PHJO 7JFX /FX (BNF 7JFX ϩάΠϯ൑ఆ ͯ͠ NewGameView Ԡ༻ྫ2.1 public enum AppCoreState: Equatable { case login(LoginState) case newGame(NewGameState) } public enum AppCoreAction: Equatable { case login(LoginAction) case newGame(NewGameAction) } $PSFͱͯ͠FOVN4UBUFʹ͢Δ͕3PPU͸TUSVDU

Slide 18

Slide 18 text

ൃද͸Ҏ্Ͱ͢🙇 ʮ͞Β͹͢΂ͯͷ*G-FU4UPSFʹΑΔը໘දࣔ੾Γସ͑ʯ ͱ͍͏αϒλΠτϧͰ͕ͨ͠ɺ $BTF-FUͷͳ͔Ͱ͸*G-FU4UPSF͕࢖ΘΕ͍ͯ·͢ɻ