見出し画像

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
    }
}

isLiked: Bool = false, dateAdded: Date = .init()

初期化は基本"name"だけあと入力すれば良い。

そして

@main
struct x15App: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .modelContainer(for: Person.self)
    }
}

.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)
                        }     
                    } 
                }
  }

.swipeActions

では保存していたものを削除します。

実行してみます。

"Favourites"の場合は赤いハートマーク。

削除してみます。

うまく動いているようです。CoreDataよりも簡単に実装が可能となっています。

この記事が気に入ったらサポートをしてみませんか?