SwiftUIでいこう! - WWDC23 SwiftData
WWDCで発表されたSwiftDataについて動画を参考に自分でも実装してみます。
まずモデル
@Model
class Person{
var name:String
var isLiked:Bool
var dateAdded:Date
init(name: String, isLiked: Bool = false, dateAdded: Date = .init()) {
self.name = name
self.isLiked = isLiked
self.dateAdded = dateAdded
}
}
初期化は基本"name"だけあと入力すれば良い。
そして
@main
struct x15App: App {
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(for: Person.self)
}
}
を追加。
@Environment(\.modelContext) private var ctx
追加して"body"を変更します。Add Itemボタンを押した時に保存するようにします。
struct ContentView: View {
@Environment(\.modelContext) private var ctx
var body: some View {
NavigationStack{
List{
}
.navigationTitle("Swift Data")
.toolbar(content: {
ToolbarItem(placement: .topBarTrailing) {
Button("Add Item"){
let person = Person(name: "Hello \(Date().formatted(date:.numeric,time: .omitted))")
ctx.insert(person)
do{
try ctx.save()
}catch{
print(error.localizedDescription)
}
}
}
})
}
}
そして
favourites
@Query(FetchDescriptor(
predicate: #Predicate{$0.isLiked == true},
sortBy:[SortDescriptor(\.dateAdded,order:.reverse)]),
animation: .snappy) private var favourites:[Person]
normal
@Query(FetchDescriptor(
predicate: #Predicate{$0.isLiked == false},
sortBy:[SortDescriptor(\.dateAdded,order:.reverse)]),
animation: .snappy) private var normal:[Person]
リストを作り込んでいきます。
List{
DisclosureGroup("Favourites"){
ForEach(favourites){person in
HStack{
Text(person.name)
}
}
}
DisclosureGroup("Normal"){
ForEach(normal){person in
HStack{
Text(person.name)
}
}
}
}
Add Itemボタンを押した時に"isLiked"について"toggle"ということなので押すたびに"Normalと"Favourites"を変更し保存します。
DisclosureGroup("Normal"){
ForEach(normal){person in
HStack{
Text(person.name)
Spacer()
Button(action: {
person.isLiked.toggle()
try? ctx.save()
}, label: {
Image(systemName: "suit.heart.fill")
.tint(person.isLiked ? .red: .gray)
})
}.swipeActions{
Button{
ctx.delete(person)
try? ctx.save()
} label: {
Image(systemName: "trash.fill")
}
.tint(.red)
}
}
}
}
では保存していたものを削除します。
実行してみます。
"Favourites"の場合は赤いハートマーク。
削除してみます。
うまく動いているようです。CoreDataよりも簡単に実装が可能となっています。
この記事が気に入ったらサポートをしてみませんか?