728x90
반응형
안녕하세요🐶
빈지식 채우기의 비니🙋🏻♂️입니다.
오늘의 포스팅은 WWDC 2023의 세 번째 - SwiftData에 대해 알아보도록 하겠습니다.
1. 개요
- iOS17+ 에서 제공한다.
- Swift macro가 제공하는 표현식을 사용한다.
- @Model 키워드를 사용한다.
- SwiftData는 즉시 사용할 수 있도록 기본 Value Type 프로퍼티를 포함한다.
- 기본 타입 ( String, Int ... )
- Collection 타입 ( Array, Set, Dictionary )
- 기타 ( Struct, Codable )
- SwiftData 모델은 타입을 관계로 참조한다.
- 모델 유형간에 link를 만들 수 있다.
2. @Model 키워드
// Adding @Model to Trip
import SwiftData
@Model
class Trip {
var name: String
var destination: String
var endDate: Date
var startDate: Date
var bucketList: [BucketListItem]? = []
var livingAccommodation: LivingAccommodation?
}
- SwiftData 모듈 임포트하여 사용한다.
- SwiftData를 사용하려는 클래스 바로 위에 @Model을 선언한다.
2-1. 부가적인 Metadata
- @Model : 저장된 모든 프로퍼티를 수정할 수 있다. ( SwiftData 모델임을 선언 )
- @Attribute : 고유성 제약 조건을 추가 가능하다.
- @Relationship : 모델간의 링크 동작을 변경할 수 있다.
- @Transient : SwiftData에 특정 프로퍼티를 포함히지 않도록 할 수 있다.
// Adding @Model to Trip
import SwiftData
@Model
class Trip {
@Attribute(.unique) var name: String // (1)
var destination: String
var endDate: Date
var startDate: Date
@Relationship(.cascade) var bucketList: [BucketListItem]? = [] // (2)
var livingAccommodation: LivingAccommodation?
}
- @Attribute(.unique) : 변수 앞에 선언하여 유니크함을 지정할 수 있다.
- @Relationship(.cascade) : 선언한 변수가 삭제될때마다 SwiftData에 관련 항목을 모두 삭제가 가능하다.
3. ModelContainer
- Model 타입에 지속가능한 backend를 제공한다.
- 스키마를 지정하면, 설정(Configuration) 과 이주(Migration) 옵션을 사용자화 할 수 있다.
- ModelContainer 설정이 되면 ModelContext로 데이터를 가져오고 저장할 준비가 완료된다.
// Swift
import SwiftData
let container = try ModelContainer(for: [Trip.self, LivingAccommodation.self],
configurations: ModelConfiguration(url: URL("path")))
// SwiftUI
import SwiftData
import SwiftUI
@main
struct TripApp: App {
var body: ome Scene {
WindowGrop {
ContentView()
}
.modelContainer(for: // .modelContainer 를 통해 사용이 바로 가능하다.
[Trip.self,
LivingAccommodation.self])
)
}
}
4. ModelContext
// SwiftUI
import SwiftData
import SwiftUI
struct Contextview : View {
@Environment(₩.modelContext) private var context
}
- 모델에 대한 모든 변경 사항을 관찰한다.
let tripPredicate = #Predicate<Trip> { // #Predicate 키워드를 사용하여 데이터 분류식 제공
$0.destination == "New York" &&
$0.name.containes("birthday")
}
let descriptor = FetchDescriptor<Trip>( // FetchDescriptor 를 사용하여 정렬 순서 제공,
sortBy: SortDescriptor(₩Trip.name), // context.fetch()를 통해 데이터 분류 및 로드
predicate: tripPredicate
}
let trips = try context.fetch(descriptor)
var myTrip = Trip(name: "Birthday Trip", destication: "New York")
context.insert(myTrip) // 추가의 경우 context.insert() 사용
context.delete(myTrip) // 삭제의 경우 context.delte() 사용
try context.save() // 저장의 경우 context,save() 사용
5. SwiftUI에서SwiftData
// SwiftUI
import SwiftData
import SwiftUI
struct conetnetView: View {
@Query(sort: ₩.startDate, order: .reverse) var trips: [Trip]
@environment(₩.modelContext) var codelContext
...
}
- @Query를 사용하여 손쉽게 데이터 사용이 쉬워진다. ( 데이터 정렬 )
- @Environment를 사용하여 쉽게 Model Context를 전파할 수 있다.
- SwiftUI에서 SwiftData를 사용하면 Observe 기능이 제공되므로 자동으로 새로고침이 된다. ( @Published 필요 없다 )
이상으로 [WWDC 2023] (3) SwiftData 포스팅을 마치겠습니다.
틀린 부분이나 궁금한 사항은 댓글 남겨주세요~
참고
728x90
반응형
'Apple 🍎 > WWDC 2023' 카테고리의 다른 글
[WWDC 2023] (6) 스위프트의 새로운 기능 - 2 (0) | 2023.09.08 |
---|---|
[WWDC 2023] (5) 스위프트의 새로운 기능 - 1 (0) | 2023.09.07 |
[WWDC 2023] (4) Swift Macro (0) | 2023.09.06 |
[WWDC 2023] (2) Widget 확장 (0) | 2023.08.28 |
[WWDC 2023] (1) SharePlay (4) | 2023.08.28 |