โ Property Wrapper
์์ฑ(Property)์ ์ถ๊ฐ์ ์ธ ํ๋์ด๋ ๊ณ์ฐ์ ๋ง๋ถ์ฌ์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ตฌ์กฐ์ด๋ค.
ํ๋กํผํฐ ๋ํผ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ๋ก์ง์ด๋ ๊ณ์ฐ์ ๊ฐ๊ฒฐํ๊ฒ ํํํ ์ ์์ด ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ํฅ์์ํจ๋ค.
โ PreView ( ์์ฝ )
- @State : ๋ทฐ ๋ด๋ถ์์ ๊ด๋ฆฌ๋๋ ๋ก์ปฌ ์ํ๊ฐ ์ ์ฅ
- @Binding : ๋ถ๋ชจ ๋ทฐ๋ก๋ถํฐ ๋ฐ์ ๊ฐ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง
- @ObservedObject : ์ธ๋ถ ํด๋์ค์ ์ํ๋ฅผ ์ถ์ ํ๊ณ ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
- @EnvironmentObject : ์ฑ ์ ์ฒด์์ ๊ณต์ ๋๋ ์ํ ๊ฐ์ฒด ์ฌ์ฉ
- @Published : ObservableObject์ ์์ฑ์ ์ ๋ฐ์ดํธํ ๋ View๋ฅผ ์๋ ๋ฆฌํ๋ ์
- @AppStorage : UserDefaults์ ๊ฐ์ ์ ์ฅํ๊ณ ๋ถ๋ฌ์ฌ ๋ ์ฌ์ฉ
- @SceneStorage : ์ฑ์ 'Scene' ์ธ์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
- @Environment : ์์คํ ์ ๊ณต ํ๊ฒฝ ์ค์ ์ ์ ๊ทผ
- @StateObject : ๋ทฐ๊ฐ ์์ ํ๊ณ ์๋ ์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ค.
- @FetchRequest : CoreData์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ทฐ์ ์ฐ๊ฒฐํ๋ค.
โ @State
- ๋ก์ปฌ ์ํ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ๊ด๋ฆฌํ๋ค ( ๊ฐ๋จํ ๋ฐ์ดํฐ ์ ์ฅ )
์ฅ์ : ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ์ดํดํ๊ธฐ ์ฝ๋ค.
๋จ์ : ํด๋น View ๋ด์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์ฌ์ฉ : View์ ๋ก์ปฌ ์ํ๋ฅผ ๊ด๋ฆฌํ ๋ ์ฌ์ฉํ๋ค.
์ฌ์ฉ ์ด์ : ์ํ๋ฅผ ๊ฐ๋จํ๊ฒ ์ถ์ ํ๊ณ UI๋ฅผ ์๋์ผ๋ก ์ ๋ฐ์ดํธ ํ๊ธฐ ์ํด
์ด๋ป๊ฒ ์ฌ์ฉ : View ๋ด๋ถ์์ @State ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ๋ณ์ ์ ์ธ
@State private var count = 0
์ฌ์ฉ ์์
struct ContentView: View {
@State private var count = 0
var body: some View {
Button("์นด์ดํธ ์ฆ๊ฐ") {
count += 1
}
Text("ํ์ฌ ์นด์ดํธ: \(count)")
}
}
โ @Binding
์์ View์ ์ํ๋ฅผ ํ์ View์ ์ฐธ์กฐํ๊ณ ์กฐ์ํ๋ค.
์ฅ์ : ๋ฐ์ดํฐ ํ๋ฆ์ ๋ช ํํ๊ฒ ํํ๊ฐ๋ฅ
๋จ์ : ์์ View์ ํ์ View๊ฐ ์ํ์ ๋ํด ๊ฐํ๊ฒ ์ฐ๊ฒฐ
์ฌ์ฉ : ์์ View์ ์ํ๋ฅผ ํ์ View์์ ์์ ํ ํ์๊ฐ ์์ ๋
์ฌ์ฉ ์ด์ : ์ํ๋ฅผ ์ ์ฐํ๊ฒ ๊ณต์ ํ๊ณ ๊ด๋ฆฌํ๋ค.
์ด๋ป๊ฒ ์ฌ์ฉ : ํ์ View์์ @Binding ๋ณ์๋ฅผ ์ ์ธํ๊ณ ์์ View์์ ์ฐ๊ฒฐํ๋ค.
@Binding var isOn: Bool
์ฌ์ฉ์์
struct SwitchView: View {
@Binding var ioOn: Bool
var body: some View {
Toggle("์ค์์น", isOn: $isOn)
}
}
โ @ObservedObject
๋ณต์กํ ๋ฐ์ดํฐ ๋ชจ๋ธ์ View์ ๋ฐ์ธ๋ฉ
์ฅ์ : ์ฌ๋ฌ View์์ ๊ณต์ ๊ฐ๋ฅ
๋จ์ : ObservableObject ํ๋กํ ์ฝ์ ์ ์ฉํ ๋ณ๋์ ํด๋์ค๊ฐ ํ์
์ฌ์ฉ : ์ฌ๋ฌ ํ๋ฉด์์ ๊ณต์ ํด์ผ ํ๋ ์ ๋ณด๋ ๋ณต์กํ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ ๋ ์ฌ๋ฌ View์์ ๊ณต์ ํ ๋ ์ฌ์ฉ
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ํ๋กํ ์ ๋ณด์ ๊ฐ์ ๋ณต์กํ ๋ฐ์ดํฐ !
์ฌ์ฉ ์ด์ : ์ํ ๋ณํ๋ฅผ ๊ฐ์งํ๊ณ UI๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
์ด๋ป๊ฒ ์ฌ์ฉ : @ObservedObject ์ด๋ ธํ ์ด์ ๊ณผ ํจ๊ป ObservableObject๋ฅผ ์ ์ฉํ ํด๋์ค์ ์ธ์คํด์ค ์ฌ์ฉ
@ObservedObject var viewModel: MyViewModel
์ฌ์ฉ์์
struct MyView: View {
@ObservedObject var viewModel: MyViewModel
var body: some View {
Text(viewModel.title)
}
}
โ @EnvironmentObject
์ฑ ์ ์ฒด์์ ๊ณต์ ๋๋ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃฌ๋ค.
์ฅ์ : ์ฑ ์ ์ฒด์ ์ํ๋ฅผ ํ ๊ณณ์์ ๊ด๋ฆฌ ๊ฐ๋ฅ
๋จ์ : ๋ช ์์ ์ธ ์ด๊ธฐํ๊ฐ ์์ผ๋ฉด Runtime Error ๋ฐ์ ๊ฐ๋ฅ
์ฌ์ฉ : ์ฑ ์ ์ฒด์์ ๊ณต์ ๋๋ ๋ฐ์ดํฐ๊ฐ ์์ ๋, ์ฑ์ ๋ชจ๋ ๊ณณ์์ ์ ๊ทผํด์ผํ๋ ํฐ ์ ๋ณด๋ฅผ ๋ด์ ๋ ์ฌ์ฉ ( ์๋ฅผ ๋ค์ด, ๋ก๊ทธ์ธ ์ํ, ํ ๋ง ์ค์ ๋ฑ )
์ฌ์ฉ ์ด์ : ์ฑ ์ ์ฒด์ ์ํ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ค.
์ด๋ป๊ฒ ์ฌ์ฉ : @EnvironmentObject ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ๋ณ์ ์ ์ธ
@EnvironmentObject var appData: AppData
์ฌ์ฉ์์
strcut ContentView: View {
@EnvironmentObject var appData: AppData
var body: some View {
Text("์ ์ฒด ์ฌ์ฉ์์ : \(appData.totalUsers)")
}
}
โ๏ธ State, ObservedObject, EnvironmentObject ๊ณตํต์
๋ชจ๋ SwiftUI์์ Data๋ฅผ ๊ด๋ฆฌํ๊ณ UI๋ฅผ ์ ๋ฐ์ดํธํ๋๋ฐ ์ฌ์ฉ
โ๏ธ State, ObservedObject, EnvironmentObject ์ฐจ์ด์
- ๋ฒ์ : State๋ ํ๋์ View, ObservedObject๋ ์ฌ๋ฌ View, EnvironmentObject๋ ์ฑ ์ ์ฒด์์ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
- ๋ณต์ก์ฑ : State๋ ๊ฐ๋จํ ๋ฐ์ดํฐ, ObservedObject์ EnvironmentObject๋ ๋ณต์กํ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃฐ ์ ์์
โ๏ธ ObservedObject์ EnvironmentObject ๊ณตํต์
์ํ ๊ด๋ฆฌ ๊ฐ์ฒด๋ฅผ View์ ์ฐ๊ฒฐ
โ๏ธ ObservedObject์ EnvironmentObject ์ฐจ์ด์
ObservedObject๋ ๋ช ์์ ์ผ๋ก ์ธ์คํด์ค๋ฅผ ์ ๋ฌํด์ผํ๋ฉฐ, EnvironmentObject๋ ์ฑ ์ ์ฒด์ ์ฃผ์ ๋ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ฐพ์
โ๏ธ State์ Binding ๊ณตํต์
์ํ ๋ณ์๋ฅผ ์ ์ธ
โ๏ธ State์ Binding ์ฐจ์ด์
์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฅด๋ค. State๋ View๋ด๋ถ์์๋ง ์ฌ์ฉ๋๋ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ , Binding์ ์์ View์ ํ์ View ์ฌ์ด์์ ์ํ๋ฅผ ๊ณต์
โ @Published
ObservedObject์ ์์ฑ์ ์ ๋ฐ์ดํธํ ๋ View๋ฅผ ์๋์ผ๋ก ๋ฆฌํ๋ ์(ํด๋น ๋ณ์๊ฐ ๋ณ๊ฒฝ๋๋ฉด "์ฌ๊ธฐ ๋ณํ์ด์! ๋ทฐ ๋ค์ ๊ทธ๋ ค์ฃผ์ธ์!" ๋ผ๊ณ ์๋ ค์ฃผ๋ ์ญํ )
์ฅ์ : ์ฝ๋๊ฐ ๊ฐ๊ฒฐ , ObservableObject์ ์ ์ฐ๋๋จ
๋จ์ : ํน์ ์์ฑ์๋ง ์ ์ฉ, ๋ณต์กํ ์ํ ๊ด๋ฆฌ์๋ ์ ํฉํ์ง ์์ ์ ์์
์ฌ์ฉ : ObserableObject์ ํน์ ์์ฑ์ด ๋ณ๊ฒฝ๋ ๋ UI๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ ๋
์ฌ์ฉ ์ด์ : ์ํ ๋ณํ๋ฅผ ์ฝ๊ฒ ๊ฐ์งํ๊ณ UI๋ฅผ ์๋์ผ๋ก ์ ๋ฐ์ดํธ
์ด๋ป๊ฒ ์ฌ์ฉ : @Published ์ด๋ ธํ ์ด์ ์ ์์ฑ ์์ ์ถ๊ฐ
์ฌ์ฉ์์
class Counter: ObservableObject {
@Published var count = 0 // ์ด ๋ณ์๊ฐ ๋ฐ๋ ๋๋ง๋ค ๋ทฐ๋ ์๋์ผ๋ก ์
๋ฐ์ดํธํ๋ค.
}
struct ContentView: View {
@ObservedObject var counter = Counter()
var body: some View{
Text("Count: \(counter.count)")
}
}
@Published๋ ๋ณ์๊ฐ ๋ฐ๋๋ฉด ๋ทฐ์ ์๋ ค์ฃผ์ด ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋๊ฒ ํ๋ ๋งค์ฐ ์ ์ฉํ ๋๊ตฌ
โ @AppStorage
์ฌ์ฉ์ ๊ธฐ๋ณธ ์ค์ ์ ์ฝ๊ฒ ์ ์ฅํ๊ณ ์กฐํ
์ฅ์ : UserDefaults๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐํธํ๋ค.
๋จ์ : ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์๋ ์ ํฉํ์ง ์๋ค.
์ฌ์ฉ : ์ฌ์ฉ์ ์ค์ ์ ์ ์ฅํ๊ณ ์กฐํํ ๋
์ฌ์ฉ ์ด์ : ๊ฐ๋จํ ๋ฐ์ดํฐ ์ ์ฅ์ด ํ์ํ ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ค.
์ด๋ป๊ฒ ์ฌ์ฉ : @AppStorage์ด๋ ธํ ์ด์ ๊ณผ ํจ๊ป ์ ์ฅ ํค๋ฅผ ์ง์
@AppStorage("user_name") var userName: String = "Guest"
์ฌ์ฉ์์
struct ContentView: View{
@AppStorage("user_name") var userName: String = "Guest"
var body: some View{
Text("ํ์ํฉ๋๋ค, \(userName)")
}
}
โ @SceneStorage
์ฑ์ ๋ค์ํ Scene์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์
์ฅ์ : ์ํ ๋ณต์์ด ์ฝ๋ค.
๋จ์ : ๋ณต์กํ ๋ฐ์ดํฐ ์ ์ฅ์๋ ์ ํฉํ์ง ์์ ( ๋ฐ์ดํฐ ํ์ ์ ํ, ๋ก์ปฌ ์ ์ฅ์ด๋ผ ์ฌ๋ฌ ๋๋ฐ์ด์ค๊ฐ์ ์ํ ๊ณต์ X)
์ฌ์ฉ : ์ฑ์ ๋ค์ํ '์ฅ๋ฉด'๊ฐ์ ๋ฐ์ดํฐ ๊ณต์ ์ ์ฌ์ฉ
์ฌ์ฉ ์ด์ : ์ฌ์ฉ์๊ฐ ์ฑ์ ๋ค์ ์ด์์ ๋ ์ด์ ์ํ๋ฅผ ๋ณต์ํ๊ธฐ ์ํด
์ด๋ป๊ฒ ์ฌ์ฉ : @SceneStorage๋ฅผ ๋ณ์ ์์ ์ฌ์ฉํ๋ค.
์ฌ์ฉ ์ : ํญ์ ์ ํ ์ํ๋ฅผ ๊ธฐ์ตํ๋ ์ฝ๋์์ ์ฌ์ฉ. ex ํญ ์ ํ ์ํ
์ฌ์ฉ์์
struct ContentView: View{
@SceneStorage("selectedTab") var selectedTab: String?
var body: some View{
TabView(selection: $selectedTab){
Text("Tab 1")
.tabItem {
Text("Tab 1")
}
.tag("firstTab")
Text("Tab 2")
.tabItem{
Text("Tab 2")
}
.tag("secondTab")
}
}
}
์ฐธ๊ณ ๋ก ์ด ์์๋, ํญ์ ์ ํ ์ํ๋ selectedTab ๋ณ์์ ์ ์ฅ๋๊ณ , ์ฑ์ด ์ข ๋ฃ๋ ํ ๋ค์ ์คํ๋ ๋ ์ด ์ํ๋ฅผ ๋ณต์ํ๋ค.
๐ ๋ค๋ฅธ ์ต์ ?
- @AppStorage : ๋น์ทํ์ง๋ง ์ฑ ์ ์ฒด์ UserDefaults๋ฅผ ์ฌ์ฉ. @SceneStorage๋ ํน์ 'Scene'์ ๊ตญํ๋ ์ํ๋ฅผ ์ ์ฅํ๋ค.
๐ AppStorage, SceneStroage ๊ณตํต์ ๊ณผ ์ฐจ์ด์
- ๊ณตํต์ : ๋๋ค ์ฑ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ๋๋ฐ ์ฌ์ฉ
- ์ฐจ์ด์ : AppStorage๋ ์ฑ ์ ์ฒด์ ๊ฑธ์ณ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ๋ฉฐ, @SceneStorage๋ ํน์ 'Scene'์์๋ง ๊ทธ๋ ๊ฒ ํจ
โ @Environment
์์คํ ํ๊ฒฝ ๋ณ์๋ ์ฑ ์ค์ ์ View๋ก ์ฃผ์
์ฅ์ : ์ ์ญ ์ค์ ์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์์
๋จ์ : ์ฌ์ฉ ๊ฐ๋ฅํ ํค๊ฐ SwiftUI์ ์ํด ์ ํ๋จ
์ฌ์ฉ : ์์คํ ์ค์ ์ View์์ ํ์๋ก ํ ๋
์ฌ์ฉ ์ด์ : ์์คํ ์ค์ ์ ์ฝ๊ณ ํจ์จ์ ์ผ๋ก ์ ๊ทผํ๊ธฐ ์ํด
์ด๋ป๊ฒ ์ฌ์ฉ : @Environment์ด๋ ธํ ์ด์ ๊ณผ ํจ๊ป ํน์ ํค๋ฅผ ์ฌ์ฉ
@Environment(\.locale) var locale
์ฌ์ฉ์์
struct ContentView: View{
@Environment(\.locale) var locale
var body: some View {
Text("ํ์ฌ ๋ก์ผ์ผ: \(locale)")
}
}
โ๏ธ AppStorage์ Environment ๊ณตํต์ ๊ณผ ์ฐจ์ด์
- ๊ณตํต์ : ๋ ๋ค ์ค์ ๊ฐ์ ์ ์ฅํ๊ณ ์กฐํํ๋๋ฐ ์ฌ์ฉ
- ์ฐจ์ด์ : AppStorage๋ ์ฌ์ฉ์ ์ค์ ์ UserDefaults์ ์ ์ฅ, Environment๋ ์์คํ ํ๊ฒฝ ์ค์ ์ ๊ฐ์ ธ์ด
โ @StateObject
์์ ๊ถ์ ๊ฐ์ง๋ ์ต์ ๋ฒ๋ธ ์ค๋ธ์ ํธ๋ฅผ ์ ์ฅ ( SwiftUI์์ ์ฐธ์กฐ ํ์ ์ ์ํ ๊ฐ์ฒด๋ฅผ ์์ ํ๊ฒ ์์ ํ๊ณ ๊ด๋ฆฌ)
์ฅ์ : ์ํ ์์ ๊ถ ( ์ํ ๊ฐ์ฒด๋ฅผ ์์ ํ๊ฒ ์์ ๋ฐ ๊ด๋ฆฌ), ๋ฐ์ดํฐ ๊ณต์ (์ฌ๋ฌ ๋ทฐ์์ ๊ณต์ ๊ฐ๋ฅ)
๋จ์ : ๋จ์ผ ๋ทฐ์์๋ง ์์ ํ ์ ์์, ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ( ๊ฐ์ฒด๊ฐ ๋ทฐ ์ธ๋ถ์์ ์์ฑ๋์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์์ ์ํ )
์ฌ์ฉ : ๋ทฐ์ ๋ทฐ ๊ณ์ธต์์ ๊ณต์ ๋์ด์ผ ํ๋ ์ํ๊ฐ ์๋ ๊ฒฝ์ฐ
์ฌ์ฉ ์ด์ : ๋ฐ์ดํฐ์ ์์ ๊ถ๊ณผ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๊ฑฐ๋ ๋ฐ์ดํฐ ๋๋ ์ํ๋ฅผ ๋ทฐ ๊ณ์ธต์ ์์ ํ๊ฒ ๊ณต์ ํ๊ณ ์ถ์ ๋
์ด๋ป๊ฒ ์ฌ์ฉ : @StateObject ์ด๋ ธํ ์ด์ ์ ๋ณ์ ์์ ๋ถ์ฌ ์ฌ์ฉ
์ฌ์ฉ ์ : viewModel์ ๋ทฐ์์ ์ง์ ์์ฑํ๊ณ ๊ด๋ฆฌํ ๋
์ฌ์ฉ์์
class Counter: ObservableObject{
@Publised var count = 0
}
struct ContentView: View {
@StateObject var counter = Counter()
var body: some View{
VStack {
Text("Count: \(counter.count)")
Button("Increment") {
counter.count += 1
}
}
}
}
@StateObject๋ฅผ ์ฌ์ฉํ์ฌ Counter๋ผ๋ ObservableObject๋ฅผ contentView๋ด์์ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ์ฝ๋ ์์ .
์ด ์์ ์์ Counter๋ ์ํ๋ฅผ ๋ฐํํ๋ ํด๋์ค์ด๊ณ , @Publised ํ๋กํผํฐ ๋ํผ๋ฅผ ์ฌ์ฉํ์ฌ count๋ณ์์ ๋ณํ๋ฅผ ๊ฐ์ง.
CouterView๋ ์ด Counter ๊ฐ์ฒด๋ฅผ @StateObject๋ก ์ ์ธํ์ฌ ๋ทฐ๊ฐ ์๋ฉธ๋์ด ๋ค์ ์์ฑ๋ ๋์๋ Counter๊ฐ์ฒด๊ฐ ์ ์ง๋๊ฒ ํจ.
์ด๋ ๊ฒ ํ๋ฉด Counter์ ์ํ๊ฐ ContentView์ ์์ ํ๊ฒ ๋ฐ์ธ๋ฉ๋๊ณ , 'Increment'๋ฒํผ์ ๋๋ฅด๋ฉด count๊ฐ์ด ์ฆ๊ฐํ๋ฉด์ UI๊ฐ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋จ.
โ @FetchRequest
Core Data ํจ์น ์์ฒญ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ธ๋ฉํจ
์ฅ์ : CoreData ํตํฉ์ด ๋งค์ฐ ์ฌ์. ์๋ ์ ๋ฐ์ดํธ ( CoreDate ๋ณ๊ฒฝ ์ฌํญ ์๋ ๋ฐ์ )
๋จ์ : CoreData์๋ง ํนํ๋์ด์์( Only CoreData), ์ฟผ๋ฆฌ์ ํ(๋ณต์กํ ์ฟผ๋ฆฌ ์ํ ํ ์ ์์)
์ธ์ ์ฌ์ฉ : CoreData๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์, ์ด๋ฅผ ๋ทฐ์ ํ์ํ ํ์๊ฐ ์์ ๋
์ ์ฌ์ฉ : CoreData ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๊ฐ์ ธ์ค๊ณ UI๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ํด
์ด๋ป๊ฒ ์ฌ์ฉ : @FetchRequest ์ด๋ ธํ ์ด์ ์ ๋ณ์ ์์ ๋ถ์ฌ ์ฌ์ฉ
์ฌ์ฉ ์ : CoreData์ ์ํฐํฐ ๋ชฉ๋ก์ ํ ์ด๋ธ ๋ทฐ์ ํ์ํ ๋
์ฌ์ฉ์์
import SwiftUI
import CoreData
struct ContentView: View {
@FetchRequest(
sortDescriptors: [NSSortDecriptor(keyPath: \Item.timestamp, ascending:true)],
animation: .default)
private var items: FetchedResults<Item>
var body: some View{
List {
ForEach(items) { item in
Text("Item at \(item.timestamp!, formatter: itemFormatter")
}
}
}
}
๐ ๋ค๋ฅธ ์ต์ ๊ณผ์ ์ฐจ์ด์
- ObservedObject์์ ์ฐจ์ด์ : ObservedObject๋ ์ผ๋ฐ์ ์ธ ObservableObject๋ฅผ ๋ฐ์ธ๋ฉํ ๋ ์ฌ์ฉ๋๋ฉฐ, FetchRequest๋ CoreData์ ํนํ๋์ด์๋ค.
๐ ๊ณตํต์ ๊ณผ ์ฐจ์ด์
- ๊ณตํต์ : ๋ ๋ค ๋ฐ์ดํฐ๋ฅผ ๋ทฐ์ ๋ฐ์ธ๋ฉํ๋๋ฐ ์ฌ์ฉ
- ์ฐจ์ด์ : @StateObject์ ์ผ๋ฐ์ ์ธ ์ํ๊ด๋ฆฌ์ ์ฌ์ฉ, FetchRequest๋ CoreData์ ํนํ
โ ๋ฐ์ดํฐ์ ์์ ์ ๋ฒ์
- ์ํ๊ด๋ฆฌ ( @State, @Binding, @ObservedObject, @StateObject, @EnvironmentObject) : ์ด๋ค์ ๋ฐ์ดํฐ์ ์ํ๋ฅผ ๋ทฐ์ ์ฐ๊ฒฐ์ํค๋ ์ญํ
- ๋ฐ์ดํฐ ์ ์ฅ ( @AppStorage, @SceneStorage) : ์ด ๋ ๋ํผ๋ ๋ฐ์ดํฐ๋ฅผ ์ง์์ ์ผ๋ก ์ ์ฅํ๋ ์ญํ
- ์์คํ ์ ๋ณด ์ ๊ทผ ( @Environment, @FetchRequest) : ์ด๋ค์ ์ฑ์ ์คํ ํ๊ฒฝ์ด๋ ์ธ๋ถ ๋ฐ์ดํฐ์ ๋ํ ์ ๊ทผ์ ๋ด๋น
โ ์๋ฆผ ๋ฉ์ปค๋์ฆ
- ์๋์๋ฆผ ( @State, @Published, @ObservedObject, @EnvironmentObject, @StateObject) : ์ด๋ค์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ ์๋์ผ๋ก ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธ
- ๋ช ์์ ์๋ฆผ ( @Binding, @Environment, @FetchRequest, @AppStorage, @SceneStorage) : ์ด๋ค์ ์ํ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์ธ๋ถ ์์ธ( ์ฌ์ฉ์ ์ก์ , ์์คํ ์ค์ ๋ฑ)์ ์์กดํ๋ฉฐ, ๋ทฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ช ์์ ์ผ๋ก ์์ฒญํ ์ ์์
โ ๋ฐ์ดํฐ์ ์๋ช ์ฃผ๊ธฐ
- ๋ทฐ ์๋ช ์ฃผ๊ธฐ (@State, @Binding, @ObservedObject) : ์ด ๋ํผ๋ค์ ๋ทฐ์ ์๋ช ์ฃผ๊ธฐ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๊ฐ ์ ์ง
- ์ฑ ์๋ช ์ฃผ๊ธฐ (@AppStorage, @SceneStorage, @EnvironmentObject, @StateOjbect) : ์ด ๋ํผ๋ค์ ์ฑ์ด๋ ์ฌ(Scene)์ ์๋ช ์ฃผ๊ธฐ ๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ง
โ ๋ฐ์ดํฐ ์์ค
- ๋ด๋ถ ๋ฐ์ดํฐ (@State ,@Binding, @ObservedObject, @StateObject) : ์ด๋ค์ ์ฃผ๋ก ์ฑ ๋ด๋ถ์์ ์์ฑ๋๊ฑฐ๋ ๊ด๋ฆฌ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃธ
- ์ธ๋ถ ๋ฐ์ดํฐ (@Environment, @FetchRequest, @AppStorage, @SceneStorage, @EnvironmentObject) : ์ด๋ค์ ์ฃผ๋ก ์ฑ ์ธ๋ถ(์์คํ ์ค์ , ํ์ผ, ๋คํธ์ํฌ ๋ฑ)์์ ๊ฐ์ ธ์ค๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ
'๐ iOS > SwiftUI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SwiftUI] NavigationStack (0) | 2024.04.04 |
---|---|
[SwiftUI] Property Wrapper โก (3) | 2024.03.27 |
[iOS][SwiftUI] @State @Binding (1) | 2024.01.07 |
[iOS][SwiftUI] Save Color in UserDefaults (0) | 2024.01.01 |
[iOS][SwiftUI] @main @UIApplicationMain (0) | 2023.12.28 |