- ํ๋์ ๋ทฐ์์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ @State, Child View ํน์ ๋ค๋ฅธ View์์ ์๋ฐฉํฅ ๋ฐ์ดํฐ ์ ๋ฌ์์ ์ฌ์ฉํ๋ @Binding๊ณผ ๋ฌ๋ฆฌ ๋ฐ์ดํฐ ๋ชจ๋ธ๊ณผ ๋ทฐ ๊ฐ์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ์ํด ์ฌ์ฉ๋จ
- ์ฑ์ ๋ฐ์ดํฐ ๋ชจ๋ธ๊ณผ ๋ทฐ ์ฌ์ด์ ์ฐ๊ฒฐ ์์ฑ
- view (x), viewModel๊ณผ ๊ฐ์ model ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ํด๋์ค์์ ์ฌ์ฉ๋๋ ํ๋กํ ์ฝ๊ณผ propertyWrapper
OverView
- ๋ฐ์ดํฐ ๋ชจ๋ธ์ UI์ ๋ค๋ฅธ ๋ก์ง๋ค๊ณผ ๋ถ๋ฆฌ๋์ด ์์ (๋ชจ๋ํ, testable) -> ์ฑ ์๋ ์ถ๋ก ์ด ๋ ์ฌ์์ง
- UIViewController์ ์ฌ์ฉํ ๋์๋ ๋ชจ๋ธ์ ๊ฐ์ ViewController๋ก ๊ฐ์ง๊ณ ์์ ๊ฐ๋ฐ์๊ฐ ์ง์ ํ๋ฉด์ ์ ๋ฐ์ดํธ ํ๋ ๋ก์ง์ ํ์๋ก ํ์ผ๋ SwiftUI์์ ์์คํ ์ด ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ ์ด๋ฅผ UI์ ๋ฐ๋ก ๋ฐ์ํจ
- ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ view๋ฅผ ์ ๋ฐ์ดํธ ํ๋ ค๋ฉด model ํด๋์ค๋ฅผ ObservableObejct๋ก ์์ฑ, model ํด๋์ค์ properties๋ฅผ publish ํ ๋ค์ @ObservedObject ๋ฅผ ์ฌ์ฉํด์ ํด๋น model ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉ
ObservableObject Protocol
- ๋ชจ๋ธ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ๋ด์ฉ์ SwiftUI์ ํ์ํ๊ธฐ ์ํด ObservableObject ํ๋กํ ์ฝ์ ๋ชจ๋ธ ํด๋์ค์ ์ฑํํด ์ค
- ๋ง๊ทธ๋๋ก Observable ์ต์ ๋น ๊ฐ๋ฅํ ํด๋์ค๋ฅผ ์์ฑํ๋ ๊ฒ. ์ด ํ๋กํ ์ฝ์ ์ค์ํ๋ฉด ํด๋น ์ธ์คํด์ค๋ฅผ subscriber๊ฐ ๊ตฌ๋ ํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ์ด๋ฒคํธ ๋ฐฉ์ถ ๊ฐ๋ฅ ์ธ์คํด์ค๊ฐ ๋จ
class BooK: ObservableObject {
@Published var title = "๋๋ฌผ๋์ฅ"
}
Published
- Observing ํ๊ธฐ ์ํ property๋ฅผ ๊ฒ์ํ๊ธฐ ์ํด @Published Property Wrapper์ ์ฌ์ฉํ์ฌ ์ ์ํด ์ค
- ๋ด๋ถ์ ์ผ๋ก๋ didSet์์ ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํจ
- ์ฃผ์์ฌํญ
- ํ์ํ์ง ์์ ์์ฑ์ Published๋ก ์ ์ํด์ ์ฌ์ฉํ์ง ์์์ผ ํจ
- ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์๋์ง, ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ์ฌ์ฉ๋๋์ง ํ์ธํ๊ณ ์ ์ํ๋๋ก ํจ
class Library: ObservableObject {
let idx = UUID()
let name: String
@Published var books: [Book]
init(name: String, books: [Book]) {
self.name = name
self.books = books
}
}
- Library ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ฉด ์์คํ ์ idx์ name์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์์ ๊ฒ์ด๋ผ๋ ๊ฒ์ ํ์ ํ๊ณ , books๋ published ๋์๊ธฐ ๋๋ฌธ์ ํด๋น ๊ฐ์ ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ์ํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋จ. ๋ฐ๋ผ์ @Published๋ก ์ ์๋ ํ๋กํผํฐ๋ var๋ก ์ ์ธ
ObservedObject
- ObservableObject๋ protocol, ObservedObject๋ propertyWrapper
- ๋ณ๊ฒฝ ์ฌํญ์ ๋ชจ๋ํฐ๋ง ํจ
- SwiftUI์๊ฒ Observable object๋ฅผ ๊ฐ์ํ๋ผ๊ณ ์ ๋ฌํ๊ธฐ ์ํด ObservedObject ์์ฑ์ผ๋ก ํ๋กํผํฐ๋ฅผ ์ ์ํจ
struct BookView: View {
@ObservedObject var book: Book
var body: some View {
BookEditView(book: book)
}
}
struct BookEditView: View {
@ObservedObject var book: Book
// ...
}
- ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด SwiftUI ์์คํ ์ ๊ด๋ จ๋ ๋ชจ๋ ๋ทฐ์๊ฒ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํจ
- ์ ์์ ๋ฅผ ํ์ธํ๋ฉด BookEditView๋ผ๋ ์์ ๋ทฐ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋๋ฐ, Observable Object ์ ์ฒด๋ฅผ ์์ ๋ทฐ์๊ฒ ์ ๋ฌ ๊ฐ๋ฅํจ (๋ทฐ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ๋ก์ง๋ฌ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ๊ณต์ ๊ฐ๋ฅ)
- ObservedObject๋ฅผ ์ฃผ์ ํ๋ ๊ฒฝ์ฐ ObservableObject๋ฅผ ์ฌ์ฉํ๋ ๊ฒ
- ObservableObject๊ฐ ์ธ๋ถ๊ฐ ์๋ ๋ด๋ถ์์ ์ ๋ฌํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ด๋ผ๋ฉด ํ๋ฉด์ ๋ค์ ๊ทธ๋ฆด ๋ ์ด๊ธฐํ ๋ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก ์ด ๋์๋ StateObject ๋ฅผ ์ฌ์ฉํ๋๋ก ํจ
Binding์ ์ฌ์ฉํด์ ์๋ฐฉํฅ ๋ฐ์ดํฐ Passing
- UI์์ ์ฌ์ฉ์์ ์ด๋ฒคํธ๋ฅผ ๋ฐ๊ณ ์ด ๊ฐ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ์ด์ ์์ํ๋ ํ๋กํผํฐ๋ฅผ ๋ฐ์ธ๋ฉ ํด์ค์ผ ํจ
- ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ viewModel์ ์ ๋ฐ์ดํธ ํ ์ ์์
- ObservedObject, StateObject, EnvironmentObject ํ๋กํผํฐ๋ ๊ทธ ๊ฐ์ฒด ์์ ๋ฌ๋ฌ์ฌ์ธ์ ๋ถ์ฌ์ ๋ฐ์ธ๋ฉ ํด์ค ์ ์์
- ์ฌ์ฉ์๊ฐ ์ง์ ๋ฐ์ดํฐ์ ๊ฐ์ ๋ณ๊ฒฝํ๋๋ก ํ์ฉํ๊ฒ ๋จ
struct BookEditView: View {
@ObservedObject var book: Book
var body: some View {
TextField("Title", text: $book.title)
}
}
'iOS ๐ > Property wrapper' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Advanced SwiftUI] @Environment PropertyWrapper ์์๋ณด๊ธฐ (0) | 2023.10.29 |
---|---|
[iOS/SwiftUI] @State with dollar sign (two-way binding) (0) | 2023.03.18 |
[iOS/SwiftUI] ์ ํ ๊ธ์์๋ ๋ฌ๋ฌ ์ฌ์ธ์ ์ฐ๊ณ ๋ฒํผ์์๋ ์์ธ๊น? (0) | 2023.03.15 |
[iOS/SwiftUI] @State (0) | 2023.03.15 |