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: ...
๋ณ๋ค๋ฅธ ์ค๋ช
์์ด๋ ์ฌ์ฉ์๊ฐ ํด๋น UI๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง, ์ด๋ค ๊ธฐ๋ฅ์ ํฌํจํ๋์ง ์๊ฒ๋ ux๊ฐ ๊ณ ๋ ค ๋๋ฉด ์ข๊ฒ ์ง๋ง ์ค๋ช
์ด ํ์ํ ๊ฒฝ์ฐ๋ ์์ด์. ์ด ์ค๋ช
์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด TipKit์ ์ฌ์ฉํด ๋ณด๋ ค๊ณ ํฉ๋๋ค. ์ฌ์ด๋ ํ๋ก์ ํธ๋ผ minimum target iOS 17๋ก ์ค์ ํด ๋๊ณ ํด๋ณด๊ณ ์ถ์๊ฑฐ ๋ค ํด๋ณด๊ณ ์์ด์ ์์ด ์ข์๋ผ TipKit๊ณผ ๊ฐ์ ToolTip์ด ํ์ํ๋ฐ ๋ฒ์ ์ด ์๋์๋ฉด ์๋ ๊ธ์์ ํด ํ ๊ทธ๋ฆฌ๋ ๋ฐฉ๋ฒ ์ฐธ๊ณ ํด ๋ณด์ธ์! > 2023.11.06 - [SwiftUI] - [SwiftUI] Shape path๋ก Tooltip ๊ทธ๋ฆฌ๊ธฐ What is TipKit Tipkit์ iOS 17 ๋ถํฐ ์ฌ์ฉํ ์ ์๋ ํ๋ ์์ํฌ๋ก ์ ํ์ด ์ ๊ณตํฉ๋๋ค. ์ฑ์์ ์ฌ์ฉ์์๊ฒ ์ค๋ช
์ด๋ ์๋ด๋ฅผ ํ์ํ๋๋ฐ ์ฌ์ฉํ ์ ์์ด..
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๋ ์ด๋ค ์ฒ๋ฆฌ ์ดํ ์์์น ๋ชปํ๊ฒ ์ป์ ๊ฒฐ๊ณผ๋ฌผ์..
ํ๋ฆฌ๋ทฐ์์ not building -Onone๋ก ๋ก๋๊ฐ ์๋๋ฉด Edit Scheme ๋๋ฅด๊ณ Build Configuration ์์ Debug๋ก ๋ณ๊ฒฝํด์ฃผ์ธ์ ํ
์คํธ ํ๋ค๊ณ ์ ์ ๋ฐ๊ฟจ๋ค๊ฐ ๊น๋จน๊ณ ํ๋ฆฌ๋ทฐ ์ผ๋ ์๋์ ๋นํฉ;; ํ๋ฆฌ๋ทฐ ๋๋์ฒด ์ด๋ป๊ฒ ๊ตฌํ๋์ด ์๋๊ฑด์ง ์ ๊ธฐ
.overlay( Rectangle() .stroke(PWColor.gray100, lineWidth: 1) ) // .border(PWColor.gray100, width: 1) ์๋border์ ์ฌ์ฉํ๋ฉด frame์ผ๋ก ์ธ์ํ๊ฒ ๋จ. ํด๋น ์์ญ ๊น์ง ์กํ์ VStack์ผ๋ก ์์ผ๋ฉด ์ค๊ฐ์ 2๊ฐ ๋จ
TCA๋ฅผ ๊ณต๋ถํ๋ค๊ฐ Timer ์์๋ก ๋ฌด์์ ๊ตฌํํ๋ฉด ์ข์๊น ์๊ฐํด ๋ดค๋๋ ์ผํ๋ชฐ ์ฑ์ด ๋ ์ค๋ฅด๋๋ผ๊ตฌ์! ์ค๋ ์์ ๊น์ง์ ๋จ์ ์๊ฐ์ ๊ณ์ฐํด์ ์ค๋์ด ์ง๋๋ฉด ๊ตฌ๋งคํ ์ ์๋๋ก ๋ฒํผ์ ๋นํ์ฑํ ์ํฌ๊ฑฐ์์. ํ์ด๋จธ๋ฅผ ํ์ํ๋ ์ ๋ถ๋ถ์ด ๊ตฌ๋งค ๋ฒํผ์
๋๋ค. ๊ตฌํํด ๋๊ณ ๋ณด๋ ํ์ด๋จธ UI์ ๊ตฌ๋งคํ๊ธฐ ๋ฒํผ์ ๋ณ๋๋ก ๋ถ๋ฆฌํ ๊ฑธ ๊ทธ๋ฌ์ด์ ๐ฅฒ State struct State: Equatable { var isTimerOn = false var leftTime = "00:00:00" var isBuyButtonDisabled = true } isTimerOn์ด true๊ฐ ๋๋ฉด ํ์ด๋จธ๋ฅผ ์์ํ๊ณ false๊ฐ ๋๋ฉด ํ์ด๋จธ๋ฅผ cancel ์์ผ์ค๋๋ค. leftTime์ ๋ฒํผ ์์ญ์ ์๊ฐ ๋ถ๋ถ์ ํ์๋ ์คํธ๋ง ๊ฐ์ด์์. isBuy..