はじめに
先日、ハッカソンに参加したときに、SwiftDataを用いてデータを扱ってみました。
そのとき利用したsort
とfilter
の使い方について、備忘録として記録しておきます。
参考
SwiftDataの使い方はこちらの記事を参考にさせていただきました!
基本的な使い方はこちらの記事を読んでいただけるとわかるかなと思います。
また、同じく参考にしたページをいくつか載せておきます。
準備(データの型を作成)
今回は、次のようなclassを作成してみます。
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
を付与します。
import SwiftUI
import SwiftData
struct ContentView: View {
@Environment(\.modelContext) private var context
@Query private var tasks: [Task]
// ...
}
タスクをリストで表示してみる
今回は、予定名と時間を設定し、追加ボタンを押すことでタスクをリスト表示するようにしました。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3285857%2Fd864a5f4-4e6b-378e-da10-e38d2dae3e40.gif?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=435e50ad3187ddb0d76c95f04f82fa5d)
追加ボタンを押すとタスクが1番下に追加されていくのがわかると思います。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3285857%2F044272a8-0a70-9729-97ee-b09aef95e9b6.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=17f625b9d459903f24abd3888868c1a7)
このようにタスクを追加してみました。
時間順に並び替えたい
やり方
@Query(sort: \Task.time) private var tasks: [Task]
このように直すだけ。
これだけでリストが時間順に並び替えられました。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3285857%2F8e44d4e0-6cf4-2f22-3402-b253bc9e523d.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=bed6798b6c64f58552774706a4ff5739)
タスク名で絞り込みたい
やり方
@Query(filter: #Predicate<Task> { $0.name == "授業" }) var tasks: [Task]
このように直すだけ。
今回は「授業」というタスク名のものに絞り込みました。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3285857%2F0fbb07dc-9c90-fa30-d7d7-4fe7d34e6376.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d0123adf2566d75af0eb653c7adf0055)
タスク名で絞り込んで、さらに時間順に並べ替えたい
やり方
@Query(filter: #Predicate<Task> { $0.name == "授業" }, sort: \Task.time) var tasks: [Task]
このように直すだけ。
「授業」というタスク名のものだけに絞り込まれており、時間順に並べ替えられています。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3285857%2Fbd1421c7-184d-8987-d18f-6e809cfdb9ca.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=502bfb0c364d24170ebd2506f03c4cad)
おわりに
初めてのハッカソンだったので、SwiftDataをうまく使えるか不安でしたが、導入が簡単かつ直感的で使い勝手が良く、データ取得用の処理を書く必要がなかったことも良かったです!
まだまだ触り始めたばかりなので、今後も引き続き勉強していきたいと思います!
最後に、今回記事用に作成したデモのコードを載せておきます。
最後まで見ていただき、ありがとうございました!🎣