LoginSignup
6
3
iOS強化月間 - iOSアプリ開発の知見を共有しよう -

SwiftDataのsortとfilterを使ってみた

Last updated at Posted at 2023-10-02

はじめに

先日、ハッカソンに参加したときに、SwiftDataを用いてデータを扱ってみました。

SwiftDataとは?

そのとき利用したsortfilterの使い方について、備忘録として記録しておきます。

参考

SwiftDataの使い方はこちらの記事を参考にさせていただきました!
基本的な使い方はこちらの記事を読んでいただけるとわかるかなと思います。

また、同じく参考にしたページをいくつか載せておきます。

準備(データの型を作成)

今回は、次のようなclassを作成してみます。

DataModels.swift
import Foundation
import SwiftData

@Model
class Task {
    var name: String // タスク名
    var isDone: Bool // 終わったかどうか
    let time: Date // 時間

    init(name: String, time: Date) {
        self.name = name
        isDone = false
        self.time = time
    }
}

また、SwiftDataを使用してデータを出し入れするためにcontextを宣言し、データベースから取得したいデータのプロパティの前に@Queryを付与します。

ContentView.swift
import SwiftUI
import SwiftData

struct ContentView: View {
    
    @Environment(\.modelContext) private var context
    @Query private var tasks: [Task]

    // ...
}

タスクをリストで表示してみる

今回は、予定名と時間を設定し、追加ボタンを押すことでタスクをリスト表示するようにしました。

追加ボタンを押すとタスクが1番下に追加されていくのがわかると思います。

このようにタスクを追加してみました。

時間順に並び替えたい

やり方

ContentView.swift
@Query(sort: \Task.time) private var tasks: [Task]

このように直すだけ。
これだけでリストが時間順に並び替えられました。

タスク名で絞り込みたい

やり方

ContentView.swift
@Query(filter: #Predicate<Task> { $0.name == "授業" }) var tasks: [Task]

このように直すだけ。
今回は「授業」というタスク名のものに絞り込みました。

タスク名で絞り込んで、さらに時間順に並べ替えたい

やり方

ContentView.swift
@Query(filter: #Predicate<Task> { $0.name == "授業" }, sort: \Task.time) var tasks: [Task]

このように直すだけ。
「授業」というタスク名のものだけに絞り込まれており、時間順に並べ替えられています。

おわりに

初めてのハッカソンだったので、SwiftDataをうまく使えるか不安でしたが、導入が簡単かつ直感的で使い勝手が良くデータ取得用の処理を書く必要がなかったことも良かったです!

まだまだ触り始めたばかりなので、今後も引き続き勉強していきたいと思います!

最後に、今回記事用に作成したデモのコードを載せておきます。

最後まで見ていただき、ありがとうございました!🎣

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3