โ Property Wrapper ์์ฑ(Property)์ ์ถ๊ฐ์ ์ธ ํ๋์ด๋ ๊ณ์ฐ์ ๋ง๋ถ์ฌ์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ตฌ์กฐ์ด๋ค. ํ๋กํผํฐ ๋ํผ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ๋ก์ง์ด๋ ๊ณ์ฐ์ ๊ฐ๊ฒฐํ๊ฒ ํํํ ์ ์์ด ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ํฅ์์ํจ๋ค. โ PreView ( ์์ฝ ) @State : ๋ทฐ ๋ด๋ถ์์ ๊ด๋ฆฌ๋๋ ๋ก์ปฌ ์ํ๊ฐ ์ ์ฅ @Binding : ๋ถ๋ชจ ๋ทฐ๋ก๋ถํฐ ๋ฐ์ ๊ฐ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง @ObservedObject : ์ธ๋ถ ํด๋์ค์ ์ํ๋ฅผ ์ถ์ ํ๊ณ ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ค. @EnvironmentObject : ์ฑ ์ ์ฒด์์ ๊ณต์ ๋๋ ์ํ ๊ฐ์ฒด ์ฌ์ฉ @Published : ObservableObject์ ์์ฑ์ ์ ๋ฐ์ดํธํ ๋ View๋ฅผ ์๋ ๋ฆฌํ๋ ์ @AppStorage : UserDefaults์ ๊ฐ์ ์ ์ฅํ๊ณ ..

์ด ํฌ์คํ ์ Udemy "MVVM Design Pattern in iOS Using SwiftUI" ๊ฐ์๋ฅผ ๋ฐํ์ผ๋ก ์์ฑ๋ ๊ฒ์ด๋ฉฐ ๋ชจ๋ ๋ด์ฉ์ ์ ์๊ถ์ ๊ฐ์์ ์์์์ธ Mohammad Adam ์๊ฒ ์์์ ๋ฐํ๋๋ค. โ MVVM ํจํด์ด๋ Model - View - ViewModel๋ก ๋๋๋ค. ํ๋ฉด์ ๋ง๋๋ ์ฝ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ๋๊ฒ์ด MVVM์ ํต์ฌ์ด๋ค. ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ์ฌ View๊ฐ ViewModel ๊ฐ์ ๊ด์ฐฐํ์ฌ ๋ณํ๋ฅผ ๋ฐ์ํ๋ค. ์๋ฅผ ๋ค์ด์, ๋ฒํผ ํด๋ฆญ์ ํ์ ๋ ๋ค์ ์ด๋ฏธ์ง๊ฐ ๋์ค๋ ๋์์ ํ๋ค๊ณ ์น๋ค. MVC๋ ๋ฒํผ์ด ๋๋ฆฌ๋ฉด ์ด๋ฏธ์ง๋ฅผ "๋ฐ๊พผ๋ค"์ ๊ฐ๋ ์ด๋ผ๋ฉด, MVVM์ ๋ฒํผ์ ๋๋ ์ ๋ ๋ทฐ๋ชจ๋ธ์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๊ณ , ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๋ ์ด๋ฏธ์ง๋ "์์ฐ์ค๋ฝ๊ฒ ๋ฐ๋์ด์ง๋ค"๋ ๊ฐ๋ ์ด๋ค...

โ ENABLE_USER_SCRIPT_SANDBOXING ์๋ฌ ๊ธฐ์กด ํ๋ก์ ํธ๋ฅผ ์ ๋ฐ์ดํธ ํ๋ ๊ณผ์ ์์ ์ฌ์ง๊ณผ ๊ฐ์ ์๋ฌ๋ฅผ ๋ฐ๊ฒฌํ์๋ค. โ ์์ธ ํด๋น ๋ฌธ์ ์ ์์ธ์ ํ๋ก์ ํธ ํ์ผ๋ด์ Cocoa pods๊ณผ ๊ฐ์ ํ์ผ์ด ์์ ๊ฒฝ์ฐ ๋ฐ์ํ ์ ์๋๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ๊ด๋ จ ๊ณต๊ฐ ๋ฌธ์ https://github.com/CocoaPods/CocoaPods/issues/11946 โ ํด๊ฒฐ ๋ฐฉ๋ฒ PROJECT - Build Settings - Build Options - User Script Sandboxing -> NO ๋ก ์์ ํ๋ฉด ํด๊ฒฐ๋๋ค.

๐ @State @Binding Property Wrapper์ ๋ํด์ State โ PropertyWrapper ? ๋ณํ๊ฐ ์๊ธฐ๋ฉด ํด๋น ๋ณ์์ ๊ฐ์ ์ฝ๊ฑฐ๋ ์๋ก ์ธ ์ ์์์ ์๋ฏธํ๋ค. SwiftUI์์๋ property wrapper๋ฅผ ์ฌ์ฉํด์ ๋ณ์์ ๋ณํ์ ํด๋น ์์ ์ ์๋ํ ํ ์ ์๋ค. SwiftUI๋ state๋ก ์ ์ธ๋ ํ๋กํผํฐ๋ค์ ์ ์ฅ์๋ฅผ ๊ด๋ฆฌํ๋ค. StateValue ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ทฐ๋ ํด๋น value์ appearance๋ฅผ ๋ฌดํจํํ๊ณ ๋ค์ ๊ฐ์ ๊ณ์ฐํ๋ค. State ๋ณ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด View๋ ์๋ก ๋๋๋ง์ ํ์ฌ ํญ์ ์ต์ ๊ฐ์ ๊ฐ์ง๋ค. State ์ธ์คํด์ค๋ ๊ทธ ์์ฒด๋ก ๊ฐ์ด ์๋, ๊ฐ์ ์ฝ๊ณ ์ฐ๋ ๊ฒ์ ๋งํ๋ค. ํ์ฌ ๋ทฐ UI์ ํน์ ์ํ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ง๋ค์ด์ง๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ณดํต Priv..

๐ Save Color in UserDefaults from Color Picker variable in Color Data private let COLOR_KEY = "COLOR" private let userDefaults = UserDefaults.standard saveColor func saveColor(color: Color) { let color = UIColor(color).cgColor if let components = color.components { userDefaults.set(components, forKey: COLOR_KEY) } } loadColor func loadColor() -> Color { guard let colorComponenets = userDefaults...
๐ main & UIApplication @main ํ๋ก๊ทธ๋จ์ ์ง์ ์ ์ ๋ํ๋ธ๋ค. ์ด๋ ํ๋ก๊ทธ๋จ์ด๋ ์ง ์์์ ์ธ Entry Point๊ฐ ์กด์ฌํด์ผํ๋ค. Swift์์๋ @main์ ํตํด์ ์ด๋์๋ถํฐ ์ด ์ฑ์ด ์ต์ด ์คํ๋๊ณ ์์๋ ์ง๋ฅผ ๋ช ์ํด์ฃผ๋ ํค์๋์ด๋ค. ์ด ํค์๋๋ Swift 5.3 ์ด์(Xcode 12)๋ถํฐ ์ฌ์ฉ๋ ํค์๋๋ก ๋ฐ๋ก ์ด์ด์ ์ค๋ช ํ๊ฒ ์ง๋ง @main ํค์๋๊ฐ ๋์ค๊ธฐ ์ ์๋ @UIApplcationMain ํค์๋๋ฅผ ์ฌ์ฉํ๋ค. > UIKit์ ๊ฒฝ์ฐ AppDelegate๊ฐ ์ฌ์ค์ App Life Cycle์ ๊ด๋ฆฌํ๋ ๋ชจ๋ ์ฃผ์ฒด์ด๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ @main ํค์๋๊ฐ ๋ถ๋๋ค. import UIKit @main class AppDelegate: UIResponder, UIApplicationDelegate..

๐ ์ด๊ธฐํ์ ๋ํด์ AppDelegate() init() AppDelegate๋ฅผ ์ด์ฉํ ์ด๊ธฐํ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ค AppDelegate์ ์ญํ (์ง์ ์ )์ ํ๋ ๊ฒ์ด ๋ฐ๋ก ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๊ถ์ฅ๋์ง๋ ์๋ ๋ฐฉ๋ฒ์ด๋ค. @main struct PushMessageApp: App { var body: some Scene { WindowGroup { ContentView() } } } ์ ์ฝ๋์์ ๋ณด์ด๋ App ํ๋กํ ์ฝ ์์ฒด๊ฐ ์ฑ์ ๊ตฌ์ฑ์ ๋ด๋นํ๋ ๊ตฌ์กฐ์ฒด์ ํ๋กํ ์ฝ์ ์ง์ ํด์ฃผ์ด์ ์ฑ์ ์์(Presenting) ์ง์ ์ ์ ํด์ฃผ๋ ์ญํ ์ ํ๊ฒ ๋๋ค. ๋ํ @main์ ํตํ์ฌ ์ฑ์ด ์์๋๊ณ ๊ฐ์ฅ ๋จผ์ ๋ค์ด๊ฐ์ผํ๋ ๋ถ๋ถ์ ๋ช ์ํด์ฃผ๊ณ ์๊ธฐ ๋๋ฌธ์ AppDelegate๊ฐ ํ์ํ์ง ์๋ค. ๊ทธ๋ฌ๋ ์ฑ์ ์ด๊ธฐํ ์ด์ธ์๋ AppDele..

๐ฑBrain Buddy โ๏ธ 2023๋ 5์ 17์ผ ~ 2023๋ 6์์ค ( ์ฝ 3์ฃผ ) - ๊ธฐํ - ๊ฐ๋ฐ๊ณผ์ - ์๋ฌ์ฌํญ ๊ธฐํ ์ฌ์ค ๊ธฐํ์๋๋ ํ๋ถ ์์ ์ข ์ด์ ์ ์ด๊ฐ๋ฉฐ ์๊ธฐํ๋ฉฐ ๊ณต๋ถํ๋ ๋์ ๋ชจ์ต์ ๋ ์ฌ๋ฆฌ๊ณ ๊ธฐํํ๊ฒ ๋์๋ค. ์ ๊ณต์์ ์ ์๋ ๋ด์ฉ์ ๋ฐฑ์ง์ ์ฎ๊ฒจ ์ ์ด๊ฐ๋ฉฐ ์ธ์ฐ๊ณ ๋ฌ์๋, ์ด๋ฅผ ๋ค์ ๋น์นธ์ ๋ด๊ฐ ๋ง๋ค์ด์ ์ ์ธ์ ๋ ์ํ ๋ณด๊ณ ์ถ์๋๋ฐ ๋น์นธ์ ๋ง๋ค์๊ฐ์ ์ฐจ๋ผ๋ฆฌ ์กฐ๊ธ ๋ ์ธ์ฐ๋๋ฐ ์ง์ค์ ํด๋ณด๊ณ ์ ํ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ์ฌ์ฉ์๊ฐ ์ค์ค๋ก ๊ณต๋ถํ๋ฉฐ ๋ฐฑ์ง์ ์ ์ ๋ด์ฉ๋ค์ ์ฌ์ง์ผ๋ก ์ฐ์ผ๋ฉด ํด๋น ๋ด์ฉ์ค์์ ๋๋ค์ผ๋ก ๋น์นธ์ ์์ฑํด์ฃผ๋ฉฐ ๋น์นธ ๋ด์ฉ์ ์ฑ์๋ณผ ์ ์๋ ์ฑ์ ์๊ฐํ๊ฒ ๋์๋ค. ๋ํ ์ค์ ๋ก ํ์ ์ด์ฉํด ์ํ์ ๋ณด๋ ๊ฒ๊ณผ ๊ฐ์ ๋๋์ ์ฃผ๊ธฐ ์ํด์ ํ ์คํธ ์ ๋ ฅ๋ณด๋ค๋ ์ ํํ์ฌ์ ์ฌ์ฉํ์ฌ ์ง์ ์ธ ์ ..