โ Property Wrapper ํ๋กํผํฐ๋ฅผ ๊ฐ์ธ ํน๋ณํ ํ์ ์ผ๋ก ๋ง๋ค์ด์ค๋ค. ๊ฐ๋จํ ๋งํด๋ณด๋ฉด, ์ด๋ค ๋ก์ง๋ค์ ๋งค๋ฒ ๋์ผํ๊ฒ ์ง์ ํด์ฃผ์ง ์๊ณ Property Wrapper๋ก ๋ง๋ ํ์ ์ผ๋ก ํ๋กํผํฐ๋ฅผ ์ ์ธํด ๋์ผ ๋ก์ง์ ์ํํ๋๋ก ํ๋ค. โ Property Wrapper๊ฐ ์๋ค๋ฉด ? struct House { private var width = 0 var size: Int { get { return width } set { width = pow(newValue, 20) } } } struct KoreaHouse { private var _appartment = House() private var _villa = House() var appartmentSize: Int { get { return _appar..
โ Property Wrapper ์์ฑ(Property)์ ์ถ๊ฐ์ ์ธ ํ๋์ด๋ ๊ณ์ฐ์ ๋ง๋ถ์ฌ์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ตฌ์กฐ์ด๋ค. ํ๋กํผํฐ ๋ํผ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ๋ก์ง์ด๋ ๊ณ์ฐ์ ๊ฐ๊ฒฐํ๊ฒ ํํํ ์ ์์ด ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ํฅ์์ํจ๋ค. โ PreView ( ์์ฝ ) @State : ๋ทฐ ๋ด๋ถ์์ ๊ด๋ฆฌ๋๋ ๋ก์ปฌ ์ํ๊ฐ ์ ์ฅ @Binding : ๋ถ๋ชจ ๋ทฐ๋ก๋ถํฐ ๋ฐ์ ๊ฐ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง @ObservedObject : ์ธ๋ถ ํด๋์ค์ ์ํ๋ฅผ ์ถ์ ํ๊ณ ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ค. @EnvironmentObject : ์ฑ ์ ์ฒด์์ ๊ณต์ ๋๋ ์ํ ๊ฐ์ฒด ์ฌ์ฉ @Published : ObservableObject์ ์์ฑ์ ์ ๋ฐ์ดํธํ ๋ View๋ฅผ ์๋ ๋ฆฌํ๋ ์ @AppStorage : UserDefaults์ ๊ฐ์ ์ ์ฅํ๊ณ ..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcA2bUK%2FbtsC6qm4nE5%2Fmhn3hu3HDLJggDWEKeeY80%2Fimg.png)
๐ @State @Binding Property Wrapper์ ๋ํด์ State โ PropertyWrapper ? ๋ณํ๊ฐ ์๊ธฐ๋ฉด ํด๋น ๋ณ์์ ๊ฐ์ ์ฝ๊ฑฐ๋ ์๋ก ์ธ ์ ์์์ ์๋ฏธํ๋ค. SwiftUI์์๋ property wrapper๋ฅผ ์ฌ์ฉํด์ ๋ณ์์ ๋ณํ์ ํด๋น ์์ ์ ์๋ํ ํ ์ ์๋ค. SwiftUI๋ state๋ก ์ ์ธ๋ ํ๋กํผํฐ๋ค์ ์ ์ฅ์๋ฅผ ๊ด๋ฆฌํ๋ค. StateValue ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ทฐ๋ ํด๋น value์ appearance๋ฅผ ๋ฌดํจํํ๊ณ ๋ค์ ๊ฐ์ ๊ณ์ฐํ๋ค. State ๋ณ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด View๋ ์๋ก ๋๋๋ง์ ํ์ฌ ํญ์ ์ต์ ๊ฐ์ ๊ฐ์ง๋ค. State ์ธ์คํด์ค๋ ๊ทธ ์์ฒด๋ก ๊ฐ์ด ์๋, ๊ฐ์ ์ฝ๊ณ ์ฐ๋ ๊ฒ์ ๋งํ๋ค. ํ์ฌ ๋ทฐ UI์ ํน์ ์ํ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ง๋ค์ด์ง๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ณดํต Priv..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp7WhY%2FbtsCQ3luh6Z%2FU0jYg1CHJtsC3hGnxscTH0%2Fimg.png)
๐ 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..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJgd0a%2FbtsCIHwzGSS%2FeGbmP55TbxYMkiO82MubQ1%2Fimg.png)
๐ ์ด๊ธฐํ์ ๋ํด์ AppDelegate() init() AppDelegate๋ฅผ ์ด์ฉํ ์ด๊ธฐํ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ค AppDelegate์ ์ญํ (์ง์ ์ )์ ํ๋ ๊ฒ์ด ๋ฐ๋ก ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๊ถ์ฅ๋์ง๋ ์๋ ๋ฐฉ๋ฒ์ด๋ค. @main struct PushMessageApp: App { var body: some Scene { WindowGroup { ContentView() } } } ์ ์ฝ๋์์ ๋ณด์ด๋ App ํ๋กํ ์ฝ ์์ฒด๊ฐ ์ฑ์ ๊ตฌ์ฑ์ ๋ด๋นํ๋ ๊ตฌ์กฐ์ฒด์ ํ๋กํ ์ฝ์ ์ง์ ํด์ฃผ์ด์ ์ฑ์ ์์(Presenting) ์ง์ ์ ์ ํด์ฃผ๋ ์ญํ ์ ํ๊ฒ ๋๋ค. ๋ํ @main์ ํตํ์ฌ ์ฑ์ด ์์๋๊ณ ๊ฐ์ฅ ๋จผ์ ๋ค์ด๊ฐ์ผํ๋ ๋ถ๋ถ์ ๋ช ์ํด์ฃผ๊ณ ์๊ธฐ ๋๋ฌธ์ AppDelegate๊ฐ ํ์ํ์ง ์๋ค. ๊ทธ๋ฌ๋ ์ฑ์ ์ด๊ธฐํ ์ด์ธ์๋ AppDele..