iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

【Firestore】Swift で該当する月のデータを取得する

今回は、Firestore に保存されているデータで、該当する月のデータのみを取得してくる方法のサンプルを紹介していきたいと思います。

結論

サンプル実装は、Ballcap という Firestore のラッパーライブラリを使っていますが、基本的にやることは同じで isGreaterThanOrEqualToisLessThanOrEqualToDate の範囲を指定してあげます。今回の場合は、該当する月の範囲でデータを取得したいので、Calendar.current.dateComponents([.year, .month], from: date)date が該当する月の初日の Date を取得しています。

github.com

extension DataSource.Query {
    func `where`(_ keyPath: String, inThisMonth date: Date) -> DataSource.Query {
        let components = Calendar.current.dateComponents([.year, .month], from: date)
        guard let start = Calendar.current.date(from: components),
              let end = Calendar.current.date(byAdding: .month, value: 1, to: start) else {
            fatalError("Could not find start date or calculate end date.")
        }
        return `where`(keyPath, isGreaterThanOrEqualTo: start).`where`(keyPath, isLessThanOrEqualTo: end)
    }
}

該当する月ではなく、該当する日を取得したい場合は下記のようにします。

extension DataSource.Query {
    func `where`(_ keyPath: String, inThisDay date: Date) -> DataSource.Query {
        let components = Calendar.current.dateComponents([.year, .month, .day], from: date)
        guard let start = Calendar.current.date(from: components),
              let end = Calendar.current.date(byAdding: .day, value: 1, to: start) else {
            fatalError("Could not find start date or calculate end date.")
        }
        return `where`(keyPath, isGreaterThanOrEqualTo: start).`where`(keyPath, isLessThanOrEqualTo: end)
    }
}

という感じで本日も以上になります👷‍♀️ それではまた明日〜

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com