iOS ๐ŸŽ/Architecture

Reduce // Reduce initializer @inlinable public init(_ reduce: @escaping (_ state: inout State, _ action: Action) -> Effect) { self.init(internal: reduce) } Reduce๋Š” Effect์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํด๋กœ์ ธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ Effect์„ ์‚ฌ์šฉํ•ด์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌ Reducer ๋‚ด๋ถ€์—์„œ State๋ฅผ ๋ณ€ํ˜•ํ•˜๊ณ  ๊ด€๋ฆฌ Effect๋ฅผ Application์— ํ”ผ๋“œ๋ฐฑ (Side Effect) -> Reducer ๋‚ด๋ถ€์—์„œ Reduce๋ฅผ ๊ฐ€์ง€๊ณ  ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ์ด๋•Œ effect๋ฅผ ์ผ์œผ์ผœ ํ”ผ๋“œ๋ฐฑ์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ฅผ side effect๋ผ๊ณ  ํ•œ๋‹ค. .run Reduce๋Š” Effect์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค public..
TCA๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋‹ˆ SwiftUI ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ UIKit์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Dependency๋ฅผ ์ œ๊ณตํ•˜๊ธธ๋ž˜ ๋”ฐ๋กœ ๊ธ€์„ ์ ์–ด์•ผ ๊ฒ ๋”๋ผ๊ตฌ์š”! ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ Swinject, Niddle, Factory ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š”๋ฐ TCA์˜ Depdency๋„ ํ›Œ๋ฅญํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ์˜ ๊ณต์‹ ๋ฒˆ์—ญ์€ ์•„๋ž˜ ์‚ฌ์ดํŠธ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š” Chapter 5. Dependency | Built with Notion 5.1 TCA์™€ Dependency axiomatic-fuschia-666.notion.site ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ณด์‹œ๋ ค๋ฉด ์ด ์‚ฌ์ดํŠธ๋กœ ์ด๋™ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. Documentation pointfreeco.github.io TCA์—์„œ๋Š” DI(Dependency Inje..
SwiftUI TCA ์žฅ์  - State ์˜ ๋ณ€๊ฒฝ -> UI์— ์ฆ‰์‹œ ๋ฐ˜์˜ - ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ„๋‹จํ•จ - State ๋ณ€๊ฒฝ ๋กœ์ง ๊ด€๋ฆฌ ์šฉ์ด - ๋ณต์žกํ•œ State์™€ ์ด์— ๋”ฐ๋ฅธ Side Effect ์ฒ˜๋ฆฌ ์šฉ์ด ๋‹จ์  - State ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด ์งˆ์ˆ˜๋ก State ๋ณ€ํ™”์— ๋”ฐ๋ฅธ side effect๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›€ - ์–ด๋ ค์šด ๊ตฌํ˜„ ๋‚œ์ด๋„ ๐ŸฅŠ ๐Ÿ˜ซ TCA Binding public func binding( get: @escaping (_ state: ViewState) -> Value, send valueToAction: @escaping (_ value: Value) -> ViewAction ) -> Binding { ObservedObject(wrappedValue: self) .projectedValue[get: ...
Scope๋ž€? ์ด์ „ ํ‘œํ˜„ ๋ฐฉ์‹ struct Scope where Child : ReducerProtocol ํ˜„์žฌ ํ‘œํ˜„ ๋ฐฉ์‹ struct Scope: Reducer parent domain์„ child domain์œผ๋กœ ๋ณ€๊ฒฝ -> ํ•˜์œ„ ๋„๋ฉ”์ธ์—์„œ child reduce๋ฅผ ์‹คํ–‰ ์‹œํ‚ด ํฐ ๊ทœ๋ชจ์˜ feature์„ ์ž‘์€ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ๊ฑฐ๋‚˜ ํ•ฉ์น  ์ˆ˜ ์žˆ์Œ ์ž‘์€ ๋‹จ์œ„์˜ feature๋Š” ํฐ ๊ทœ๋ชจ์˜ feature ๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ test ๋ฐ ๋ชจ๋“ˆํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ Scope ์ƒ์„ฑ @inlinable public init( state toChildState: WritableKeyPath, action toChildAction: AnyCasePath, @ReducerBuilder child: () -> Child..
์ถœ์ฒ˜ ๋ฐ ์ฐธ๊ณ  ์‚ฌ์ดํŠธ https://axiomatic-fuschia-666.notion.site/Chapter-3-TCA-2-c56b24efb2154dad9ed8e54139247024 Chapter 3. TCA์˜ ๊ธฐ๋ณธ๊ฐœ๋…(2) ์•ž์„  ์žฅ์—์„œ ์šฐ๋ฆฌ๋Š” ์•ฑ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” State์™€ ์ด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋‹จ์ธ Action, ๊ทธ Action์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์ƒํƒœ์˜ ๋ณ€๊ฒฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” Reducer์„ ์•Œ์•„๋ณด๋ฉฐ, TCA์—์„œ์˜ ๋ฐ์ดํ„ฐํ๋ฆ„์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ axiomatic-fuschia-666.notion.site What is Store ๋Ÿฐ ํƒ€์ž„๋™์•ˆ Reducer์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ฐธ์กฐ ํƒ€์ž… ๊ฐ์ฒด ์•ฑ์˜ State, Action์„ ๊ด€๋ฆฌ State์˜ ๋ณ€ํ™” ๊ฐ์ง€ ์•ก์…˜ ์ฒ˜๋ฆฌ let store: Store public ty..
์ถœ์ฒ˜ ๋ฐ ์ฐธ๊ณ  ์‚ฌ์ดํŠธ https://axiomatic-fuschia-666.notion.site/Chapter-3-TCA-2-c56b24efb2154dad9ed8e54139247024 Chapter 3. TCA์˜ ๊ธฐ๋ณธ๊ฐœ๋…(2) ์•ž์„  ์žฅ์—์„œ ์šฐ๋ฆฌ๋Š” ์•ฑ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” State์™€ ์ด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋‹จ์ธ Action, ๊ทธ Action์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์ƒํƒœ์˜ ๋ณ€๊ฒฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” Reducer์„ ์•Œ์•„๋ณด๋ฉฐ, TCA์—์„œ์˜ ๋ฐ์ดํ„ฐํ๋ฆ„์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ axiomatic-fuschia-666.notion.site Effect๋ž€? Action์ด ๋ฐ˜ํ™˜ํ•˜๋Š” ํƒ€์ž…์„ ๋œปํ•˜๋ฉฐ Action์„ ๊ฑฐ์นœ ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฌผ์„ ์˜๋ฏธํ•œ๋‹ค. ๋น„๋™๊ธฐ ์ž‘์—…์ด๋‚˜ ์™ธ๋ถ€ ์ž‘์šฉ์— ์˜ํ•ด ๋ฐœ์ƒํ•˜๋Š” Side Effect๋Š” ์–ด๋–ค ์ฒ˜๋ฆฌ ์ดํ›„ ์˜ˆ์ƒ์น˜ ๋ชปํ•˜๊ฒŒ ์–ป์€ ๊ฒฐ๊ณผ๋ฌผ์„..
TCA๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค๊ฐ€ Timer ์˜ˆ์‹œ๋กœ ๋ฌด์—‡์„ ๊ตฌํ˜„ํ•˜๋ฉด ์ข‹์„๊นŒ ์ƒ๊ฐํ•ด ๋ดค๋”๋‹ˆ ์‡ผํ•‘๋ชฐ ์•ฑ์ด ๋– ์˜ค๋ฅด๋”๋ผ๊ตฌ์š”! ์˜ค๋Š˜ ์ž์ •๊นŒ์ง€์˜ ๋‚จ์€ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•ด์„œ ์˜ค๋Š˜์ด ์ง€๋‚˜๋ฉด ๊ตฌ๋งคํ•  ์ˆ˜ ์—†๋„๋ก ๋ฒ„ํŠผ์„ ๋น„ํ™œ์„ฑํ™” ์‹œํ‚ฌ๊ฑฐ์—์š”. ํƒ€์ด๋จธ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ € ๋ถ€๋ถ„์ด ๊ตฌ๋งค ๋ฒ„ํŠผ์ž…๋‹ˆ๋‹ค. ๊ตฌํ˜„ํ•ด ๋†“๊ณ  ๋ณด๋‹ˆ ํƒ€์ด๋จธ UI์™€ ๊ตฌ๋งคํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ๋ณ„๋„๋กœ ๋ถ„๋ฆฌํ•  ๊ฑธ ๊ทธ๋žฌ์–ด์š” ๐Ÿฅฒ State struct State: Equatable { var isTimerOn = false var leftTime = "00:00:00" var isBuyButtonDisabled = true } isTimerOn์ด true๊ฐ€ ๋˜๋ฉด ํƒ€์ด๋จธ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  false๊ฐ€ ๋˜๋ฉด ํƒ€์ด๋จธ๋ฅผ cancel ์‹œ์ผœ์ค๋‹ˆ๋‹ค. leftTime์€ ๋ฒ„ํŠผ ์˜์—ญ์˜ ์‹œ๊ฐ„ ๋ถ€๋ถ„์— ํ‘œ์‹œ๋  ์ŠคํŠธ๋ง ๊ฐ’์ด์—์š”. isBuy..
์ฐธ๊ณ  ์‚ฌ์ดํŠธ https://axiomatic-fuschia-666.notion.site/Chapter-1-Hello-TCA-70c56437681547d4b85cd1363a157356 Chapter 1. Hello, TCA ์•ˆ๋…•ํ•˜์„ธ์š”. Swift๋กœ Apple ์ƒํƒœ๊ณ„ ๊ฐœ๋ฐœ์— ์ผ์กฐํ•ด ์ฃผ์‹œ๋Š” ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„, ๋ชจ๋‘ ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค! axiomatic-fuschia-666.notion.site https://www.pointfree.co/collections/tours/composable-architecture-1-0/ep243-tour-of-the-composable-architecture-1-0-the-basics Episode #243: Tour of the Composable Architecture: The Ba..
fram
'iOS ๐ŸŽ/Architecture' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก