<h1><center> Swift Data </center></h1>
###### tags: `๐ป WWDC ์คํฐ๋`
> [color=#724cd1][name=๋ฐ๋ฆญ]
> [WWDC2023-SwiftData-๊น์ข
๊ถ๋๋ธ๋ก๊ทธ](https://ios-development.tistory.com/1403)
> [WWDC2023-SwiftData](https://developer.apple.com/videos/play/wwdc2023/10187/)
> WWDC 2023 Session ์ค ํ๋์ธ `Swift Data`์ ๋ํด ์์๋ณด์
## ๊ฐ์
- Swift ๋งคํฌ๋ก๊ฐ ์ ๊ณตํ๋ ํํ์์ ์ ๊ณตํ๋ค.
- @Model ํค์๋๋ก ์ฌ์ฉ
- iOS 17+ ์ดํ ๋ฒ์ ๋ถํฐ ์ ๊ณตํ๋ค.
- SwiftData๋ ์ฆ์ ์ฌ์ฉํ ์ ์๋๋ก ๊ธฐ๋ณธ์ ์ธ Value Type ํ๋กํผํฐ๋ฅผ ํฌํจํ๊ณ ์๋ค.
- ๊ธฐ๋ณธ ํ์
(String, Int, Double,...)
- Collection ํ์
(Array, Set, Dictionary)
- ๊ธฐํ(Struct, Codable)
- SwiftData ๋ชจ๋ธ์ ํ์
์ ๊ด๊ณ๋ก ์ฐธ์กฐํ๋ค.
- ๋ชจ๋ธ ํ์
๊ฐ์ Link๋ฅผ ๋ง๋ค์ ์๋ค.
### @Model
1. import SwiftData๋ก ๋ชจ๋์ ์ํดํธ ํ๋ค.
2. SwiftData๋ก ์ฌ์ฉํ๋ ํด๋์ค ๊ฐ์ฒด ๋ฐ๋ก ์์ @Modelํค์๋๋ฅผ ์ ์ธํ๋ค.
```swift
import SwiftData
@Model
class Trip {
var name: String
var destination: String
var endDate: Date
var startDate: Date
var bucketList: [BucketListItem]? = []
var livingAccommdation: LivingAccommodation?
}
```
### MetaData(@Model, @Attribute, @Relationship)
1. @Model: SwiftData ๋ชจ๋ธ์์ ์ ์ธํ๋ค.
2. @Attribute: ๊ณ ์ ์ฑ ์ ์ฝ ์กฐ๊ฑด์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ฐ๋ฅํ๋๋ก ํ๋ค.
3. @Relationship์ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ๊ฐ์ Link ๋์์ ๋ณ๊ฒฝํ ์ ์๋ค.
4. Transient macro๋ฅผ ์ฌ์ฉํ์ฌ SwiftData์ ํน์ ํ๋กํผํฐ๋ฅผ ํฌํจํ์ง ์๋๋ก ์ง์ํ ์ ์๋ค.
#### @Attribute
```swift
import SwiftData
@Model
class Trip {
@Attribute(.unique) var name: String
var destination: String
var endDate: Date
var startDate: Date
var bucketList: [BucketListItem]? = []
var livingAccommdation: LivingAccommodation?
}
```
- @Attribute(.unique)๋ฅผ ์ง์ ํ๊ณ ์ถ์ ๋ณ์ ์์ ์ถ๊ฐํ์ฌ ์ ๋ํฌํจ์ ์ง์ ํ๋ค.
#### @Relationship
```swift
import SwiftData
@Model
class Trip {
@Attribute(.unique) var name: String
var destination: String
var endDate: Date
var startDate: Date
@Relationship(.cascade) var bucketList: [BucketListItem]? = []
var livingAccommdation: LivingAccommodation?
}
```
- @Relationship(.cascade)์ ์ฌ์ฉํ์ฌ ์ด ๋ณ์๊ฐ ์ญ์ ๋ ๋๋ง๋ค SwiftData์ ๊ด๋ จ ํญ๋ชฉ์ ๋ชจ๋ ์ญ์ ํ๋๋ก ์ง์ํ๋ ์ค์ ์ด๋ค.
#### ModelContainer
- Model ํ์
์ ๊ดํ ์๊ตฌ์ ์ธ Backend๋ฅผ ์ ๊ณตํ๋ค(์คํค๋ง๋ฅผ ์ง์ ํ๊ธฐ๋ง ํ๋ฉด, Config์ ์ต์
๋ค์ ์ปค์คํ
ํํ ์ ์๋ค.)
- ์ง์ ํ๋ ค๋ ๋ชจ๋ธ ์ ํ ๋ชฉ๋ก์ ์ง์ ํ๊ธฐ๋ง ํ๋ฉด ๋ชจ๋ธ ์ปจํ
์ด๋ ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
- ์ปจํ
์ด๋ ์ค์ ์ด ๋๋ฉด ModelContext๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ ์ฅํ ์ค๋น๊ฐ ์๋ฃ๋๋ค.
**ModelContainer ์์ฑ์์ ํ๋ผ๋ฏธํฐ์ ํ์
๊ณผ config ๊ฐ์ ๋๊ฒจ์ ์ปจํ
์ด๋ ์์ฑ์ด ๊ฐ๋ฅํ๋ค**
```swift
import SwiftData
let container = try ModelContainer(for: [Trip.self, LivingAccommodation.self],
configurations: ModelConfiguration(url: URL(string: "path")!))
```
**SwiftUI์์๋ .modelContainer()๋ก ๋ฐ๋ก ์ฌ์ฉ๋ ๊ฐ๋ฅํ๋ค.**
```swift
import SwiftData
import SwiftUI
@main
struct TripsApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(for: [Trip.self,
LivingAccommodation.self])
}
}
```
#### ModelContext
- ๋ชจ๋ธ์ ๋ํ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊ด์ฐฐํ๊ณ ์ด์ ๋ํด ์๋ํ ๋ง์ ์์
์ ์ ๊ณตํ๋ค.
- ์
๋ฐ์ดํธ ์ถ์ , ๋ฐ์ดํฐ ๋ก๋, ๋ณ๊ฒฝ์ฌํญ ์ ์ฅ, ๋ณ๊ฒฝ์ฌํญ์ ์ทจ์ํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
**SwiftUI์์ SwiftData ์ฌ์ฉ**
```swift
import SwiftData
import SwiftUI
struct ContextView: View {
@Environment(\.modelContext) private var context
}
```