Swift Data는 애플에서 사용하던 Core Data를 쉽고 간단하게 바꾼 것 이다. 2023년에 공개되어 자료가 많이 부족하지만 그럼에도 불구하고 쉽고 편리하게 사용할 수 있다. 이게 나오기 전까지는 CoreData를 사용했다. 하지만 CoreData는 안정성, 연동성, 편의성이 많이 떨어졌다. 그래서 나온것이 SwiftData이다. 모델생성도 쉽고 빠르고 사용하는 것도 빠르다.
Swift Data에서 모델은 추가적인 도구와 파일 생성 없이 @Model만 붙여준다면 모델 생성이 가능하다. 코드를 살펴보자.
import SwiftData
import SwiftUI
@Model
class Item {
@Attribute(.unique) var id = UUID()
var timestamp: Date
var title: String
var content1: String
var content2: String
var expenses: Int
var income: Int
var lock: Bool
init(id: UUID = UUID(), timestamp: Date, title: String,
content1: String, content2: String, expenses: Int, income: Int,
lock: Bool) {
self.id = id
self.timestamp = timestamp
self.title = title
self.content1 = content1
self.content2 = content2
self.expenses = expenses
self.income = income
self.lock = lock
}
}
이코드는 나의 다이어리 앱에서 사용한 모델이다. 위에 Import SwiftData와 @Model을 통해 바로 모델을 생성할 수 있다.
Model Container는 데이터 모델의 영구적인 관리를 담당하는데 이는 데이터베이스 역할을 한다.SwiftUI 환경에서는 Model Container를 뷰에 환경에 설정되도록 할 수 있다.
@main
struct MDApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(for: [Item.self])
}
}
생성된 Model Container는 Model Context를 가져와 사용한다. swift ui에서는 @Environment를 사용하여 간단하게 Model Context를 가져온다. Model Context는 모델의 변화를 연결해주는 역할을 한다.
import SwiftUI
import SwiftData
struct ContentView: View {
@Environment(\.modelContext) private var modelContext
swiftUI 뷰에서 모델 객체를 쿼리하기 위한 @Query 매크로를 제공한다. @Query로 SwiftData에 의해 관리되는 객체를 읽는다. @Query는 데이터가 변경될 때마다 SwiftUI 뷰가 계속해서 동기화되도록 한다.
import SwiftUI
import SwiftData
struct ContentView: View {
@Environment(\.modelContext) private var modelContext
@Query private var items: [Item]
여기서는 @query가 swift data의 모든 item객체를 읽어온다.
이제 값을 생성한다. 일기 앱에서는 일기를 적고 저장하는 역할이다. 저장하는 것은 매우 간단하다. 내가 장고를 했었는데 그것과 달리 save할 필요도 없다.
func addItem() {
// 새로운 Item을 생성하고 modelContext에 추가합니다.
let newItem = Item(timestamp: birthDate, title: newTitle, content1: newContent1,content2: newContent2, expenses: totalPrice(from: newContent1), income: totalPrice1(from: newContent1), lock: newlock)
modelContext.insert(newItem)
}
이렇게 추가할 수 있다.
insert로 modelcontext에 넣어준다면 저장이 완료된다.
업데이트는 더 간단하다.
func updateItem() {
item.title = newTitle
item.expenses = totalPrice(from: newContent1)
item.content1 = newContent1
item.content2 = newContent2
item.income = totalPrice1(from: newContent1)
item.timestamp = newDate
item.lock = newlock
}
이렇게 등호로 연결만 해주면 바로 수정이 되어 저장된다. 하지만 이 값을 조회하러 와야하는데 이때는 foreach를 사용해서 값에 접근해야한다.
UpdateView에 원래 값을 보여주기 위해서
.task {
self.newTitle = item.title
newContent1 = item.content1
newExpenses = String(item.expenses)
newContent2 = item.content2
newIncome = String(item.income)
newDate = item.timestamp
newlock = item.lock
}
task를 활용해서 미리 저장된 값으로 변경해주었다.
func deleteItems(offsets: IndexSet) {
for index in offsets {
let itemToDelete = sortedItems[index]
modelContext.delete(itemToDelete)
}
}
위 코드는 리스트에서 인덱스를 확인해서 삭제하는 방법이다.
.onDelete(perform: deleteItems)
이렇게 foreach구문에 이 코드만 추가해주면 간단하게 삭제할 수 있다.
프리뷰에서 에러가 뜨는 경우를 보았다. 그 경우 코드를 추가하여 해결할 수 있다.
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
.modelContainer(for: Item.self, inMemory: true)
}
}
inMemory: true는 데이터를 메모리에만 저장하고 디스크에는 저장하지 않는 것이다. 데이터를 임시저장할때 사용한다.
Swift Data는 작년에 나온 최신 기술이여서 아직 많은 자료들이 있지는 않지만 그럼에도 쉽게 구현할 수 있을 만큼 쉽고 간단하다. 애플 공식문서에는 더 많은 내용이 있는데 조금 더 심화적으로 활용할 수 있게 더 알아봐야겠다.
Swift Data 활용한 앱
https://velog.io/@tenedict/SwiftUI-다이어리-만들기-1앱-기획-및-회고-애플-디벨로퍼-아카데미-NC1