본문 바로가기
Apple🍎/WWDC 2023

[WWDC 2023] (3) SwiftData

by 텅빈비니 2023. 8. 29.
반응형

안녕하세요🐶

빈지식 채우기의 비니🙋🏻‍♂️입니다.

 

오늘의 포스팅은 WWDC 2023의 세 번째 - SwiftData에 대해 알아보도록 하겠습니다.

 

1. 개요

SwiftData

  • 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?
}
  1. @Attribute(.unique) : 변수 앞에 선언하여 유니크함을 지정할 수 있다.
  2. @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 포스팅을 마치겠습니다.
틀린 부분이나 궁금한 사항은 댓글 남겨주세요~


참고

반응형