โ SwiftData
Why is SwiftData ?
- SwiftData๋ ์ ๋ง๋ค์ด์ก์๊น์ ?
CoreData์ Realm์ ์ฅ์ ์ ํฉ์น๋ฏํ ๋๋
What is SwiftData ?
๋ฐ์ดํฐ ๋ชจ๋ธ๋ง ๋ฐ ๊ด๋ฆฌ๋ฅผ ์ํ ๊ฐ๋ ฅํ ํ๋ ์์ํฌ
์ฆ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ทธ ์์ฒด๋ ์๋๋ผ๋ ๊ฒ.
์ธ๋ถ ํ์ผ ํ์ ์์ด ์ ์ ์ผ๋ก ์ฝ๋์ ์ง์คํ๊ณ
Swift์ ์๋ก์ด ๋งคํฌ๋ก ์์คํ ์ ์ฌ์ฉํ์ฌ ์ํ ํ API ๊ฒฝํ์ ์ ๊ณตํ๋
- ๊ตฌ์ฑ์์
- @
- .
โ @Model
ํด๋์ค๋ฅผ persistent ๋ชจ๋ธ์ด๋ผ๋ ํ์ ์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ์ญํ .
ํด๋์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํฐํฐ๊ฐ์ ์ญํ ์ ํ๊ฒ๋๊ณ , ๋ persistent ๋ชจ๋ธ์ด๋ผ๋ ํ์ ์ผ๋ก
์ฑํํ ์ด์ ์ด๊ฑด ์คํค๋ง์ผ ๋ผ๊ณ ์๋ ค์ฃผ๊ฒ ๋๋ค.
- PersistentModel : AnyObject, Obersvable, Hashable, Identifiable
SwiftData๊ฐ class๋ฅผ ๋ชจ๋ธ๋ก ๊ด๋ฆฌํ๋๋ก ํ๋ ๊ธฐ๋ฅ
โถ๏ธ Observable
๊ธฐ์กด์ iOS13๋ถํฐ ์ฌ์ฉํด์ค๋ ObservableObejct์ ๋น๊ตํ๋ค๋ฉด,
< Model์ Observable๊น์ง ํฌํจํ๊ธฐ ๋๋ฌธ์ ์ต์ข ์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด >
@Model
class Todo {
var title: String
var isDone: Bool
init(title: String, isDone: Bool){
self.title = title
self.isDone = isDone
}
}
โ @Query
- Fetch / Sync
- ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋ค๋ ๊ฒ
- ์ฆ, Model ๊ฐ์ฒด๋ฅผ Fetchํ๊ณ ๋๊ธฐํ์ํ๋ก ์ ์งํ๋ PropertyWrapper
โ Bindable
- SwiftData๋ฅผ ํตํด์ ์ฑ์ ๋ง๋ค๋, Updateํ๋ ๊ธฐ๋ฅ์ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
- ๊ธฐ์กด์ State์ Binding์ด๋ผ๋ ํ๋กํผํฐ ๋ํผ๋ฅผ ์ฌ์ฉํด์ ๋๊ฐ์ง ๋ทฐ์ ํ๋กํผํฐ๋ฅผ ์ฐ๊ฒฐํ๋ค๊ณ ๊ฐ์ ํ๋ฉด, Bindable์ Model๊ณผ ์ฐ๊ฒฐ๋์ด ์๋ค. ๊ทธ๋์ Bindable Propperty๋ก ์ ์ธํ ๊ทธ ํ๋กํผํฐ์ ๋ณํ๋ ๋ค ๊ฐ์ง๊ฐ ๋๊ณ , ๋ณํ๋ ๋ฐ์ดํฐ๋ค์ ๋ชจ๋ธ๊น์ง๋ ์ ๋ฌ์ด ๋๋ค.
<View Modifier>
- Model Container : Model Context์ ๋ฐ์ดํฐ๋ฅผ ๋ด์์ Model Container์ ๋ด๊ฒ๋๋ค.
- ModelContenxt : Model์ ๋์คํฌ์ CRUDํ๋ ๊ฐ์ฒด..
โ ModelContainer
โ ModelContext
๋น์ ํ๋ฉด ์ผ์ข ์ ํ๋ฐฐ์์
์ ์ธ
@Environment(\.modelContext) var context
์ฌ์ฉ
.context.insert(todo)
.context.delete(todo)
try context.save()
โ 1. ModelDefinition ( ๋ชจ๋ธ ์ ์ )
- Model
- Attribute : @Attribute(.) var title: String : ํ๋กํผํฐ๋ฅผ ๊ณ ์ ํ๊ฒ, ์ ๋ํฌํ๊ฒ ๋ค๋ฃฐ๊ฑด์ง, ์ํธํํด์ ์ ์ฅํ ๊ฑด์ง, ์๋๋ฉด ๋ฐ์ด๋๋ฆฌ ํํ๋ก ์ ์ฅํ ๊ฑด์ง ๋ฑ๋ฑ ..
- Realtionship : ๋ค๋ฅธ ๋ชจ๋ธ ๊ฐ์ฒด์ ์ฐ๊ด์ด ์๋ ํ๋กํผํฐ์ธ ๊ฑฐ๋ฅผ ๋ช ์ํ๋ ๋งคํฌ๋ก. ๊ทธ๋์ ์๊ฐ๋ ๋ชจ๋ธ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง ๋ ๊ฐ์ด ์ญ์ ํ ๊ฑด์ง ์ ๋ฆฌํ ์ ์์ . ๊ฐ์ด ์ญ์ ํ๊ฑฐ๋ ๋ฌด์ํ๊ฑฐ๋ ๋ฑ๋ฑ ..
- Transient : ๋ชจ๋ธ ํ์ ์ผ๋ก ์ ์ฅ์ ํ์ง ๋ง๋ผ๊ณ ์๋ฆฌ๋ ๊ฒ. ๊ทธ๋์ ์์ฅ์ด ์๋๊ธฐ ๋๋ฌธ์ default value ๋ฐ๋์ ํ์
โ 2. ModelStorage ( ๋ชจ๋ธ ์ ์ฅ )
class ModelContainer
3๊ฐ์ง ์ญํ
- ์ปจํ ์ด๋ ๋ง๋ค๊ธฐ : PersistentModel.Type
- ์ปจํ
์ด๋ ๊ตฌ์ฑํ๊ธฐ : ModelConfiguration
- ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฑ๋ก
- ๊ฐ Scene ๋๋ View์ ๋ง๋ ์คํค๋ง๋ฅผ ์ฌ๊ตฌ์ฑ
- ํ๊ฒฝ ์ค์ ํ๊ธฐ : ModelContext Environment
โ 3. ModelFetch ( ๋ชจ๋ธ ์กฐํ )
Query : Model ๊ฐ์ฒด๋ฅผ Fetchํ๊ณ ๋๊ธฐํ ์ํ๋ก์ ์งํ๋ Property Wrapper ( Fetch / Sync )
- Predicate : ๊ฒ์ ๋๋ ํํฐ๋ง์ ์ํ ๋ ผ๋ฆฌ ์กฐ๊ฑด
- FetchDescriptor : Fetch ํ ๋ ๊ธฐ์ค, ์ ๋ ฌ ์์ ๋ฐ ์ถ๊ฐ ๊ตฌ์ฑ์ ์ค๋ช ํ๋ ์ ํ
How to Use ?
Step 1 . ๋ชจ๋ธ ์ ์ํ๊ธฐ
import Foundation
import SwiftData
@Model
final class Todo {
var title: String
var isDone: Bool
var isImportant: Bool
let timestamp: Date
init(title: String, isDone: Bool = false, isImportant: Bool = false) {
self.title = title
self.isDone = isDone
self.isImportant = isImportant
self.timestamp = .now
}
}
Step2. Model Container ๋ฑ๋กํ๊ธฐ
@main
struct SwiftDataTutorialApp: App {
var body: some Scene {
WindowGroup {
TodoListView()
.modelContainer(for: Todo.self)
.modelContainer(for: [Todo.self, Tag.self]) // ๋ฐฐ์ด ํํ๋ ๊ฐ๋ฅ
}
}
}
Step 3. Model Context ์ค์ & ์ฌ์ฉ
import SwiftUI
struct TodoCreateView: View {
@Environment (\.modelContext) var context
}
Button("Create") {
context.insert(todo)
}
Button("Delete") {
context.delete(todo)
try context.save()
}
Step4. ๋ฐ์ดํฐ Queryํ๊ธฐ
@Query private var todos: [Todo] // ์ ์ธ
@Query(
filter: #Predicate { $0.isDone == false },
sort: \.title,
order: .reverse
)
private var todos: [Todo]
Step5. @Bindable ํ๋กํผํฐ ์ฌ์ฉํ๊ธฐ
Update์ ์ฃผ๋ก ์ฌ์ฉ
- dismiss๋ฐ์ ์์ง๋ง Bindable๋ก ์ ์ธํ๊ธฐ ๋๋ฌธ์ ํด๋น Bindable ๋ฐ์ดํฐ๊ฐ ๋ณ๋์ด ์์ ๋ ๋ชจ๋ธ๊น์ง ๋ค ์ ๋ฌ์ด ๋๋ค.
struct TodoUpdateView: View {
@Environment (\.dismiss) var dismiss
@Bindable var todo: Todo
var body: some View {
List {
TextField("Name", text: $todo.title)
Toggle("Important?", $todo.isImportant)
Button("Update){
dismiss()
}
.navigationTitle("Update To-Do")
}
}
}
๐ ์ฐธ๊ณ ) ์ค๋ฅ๋ ์๋์ ?
์ฐธ๊ณ )
https://youtu.be/3r_5F9Env7Q?si=IcHDKAer8qbBzaY5
'๐ iOS > SwiftUI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SwiftUI] Custom Alert View (0) | 2024.06.16 |
---|---|
[SwiftUI] View -> Flip ๊ธฐ๋ฅ (1) | 2024.06.16 |
[SwiftUI] TextEditor BackgroundColor ์ ์ฉ (0) | 2024.04.22 |
[SwiftUI] NavigationStack (0) | 2024.04.04 |
[SwiftUI] Property Wrapper โก (3) | 2024.03.27 |