swiftData에 저장된 데이터를 인수로 활용하는 View에서 preview를 설정하기 위해선 정해진 절차가 필요하다. 아래는 예시로 modelContext에 저장된 Book을 인수로 받는 DetailView의 Preview를 설정하는 방법이다.
#Preview {
do {
let config = ModelConfiguration(isStoredInMemoryOnly: true)
let container = try ModelContainer(for: Book.self, configurations: config)
let example = Book(title: "Test Title", author: "Test Author", genre: "Mystery", rating: 3, review: "This book was fun enough. But i didn't expect to be fun..")
return DetailView(book: example)
} catch {
return Text("Error: Failed to create preview. \(error.localizedDescription)")
}
}
Book 객체가 저장된 query를 여러 가지 방법으로 정리할 수 있다.
@Query(sort: \Book.title) var books: [Book]
// 혹은
@Query(sort: [SortDescriptor(\Book.title)]) var books: [Book]
@Query(sort: \Book.author, order: .reverse) var books: [Book]
// 혹은
@Query(sort: [SortDescriptor(\Book.author)]) var books: [Book]
@Query(sort: [
SortDescriptor(\Book.title),
SortDescriptor(\Book.author, order: .reverse)
]) var books: [Book]
List에서 만들어진 Book을 슬라이드하여 삭제하거나 edit mode를 통해 삭제할 수 있도록 했다.
해당 index의 정보로 책 객체를 찾아 model context에서 삭제한다.
func deleteBooks(at offsets: IndexSet) {
for offset in offsets {
let book = books[offset]
modelContext.delete(book)
}
}
마지막으로 DetailView의 navigation에 삭제 버튼을 만들고, 이 버튼을 클릭하면 취소, 삭제 옵션 버튼을 만들어 삭제할 수 있도록 설정했다.