💽

【SwiftUI】FetchRequestをinit内で初期化する方法

2023/04/07に公開

はじめに

この記事の主張

  • FetchRequestをinit内で行う
  • 親Viewから渡された引数を、FetchRequestによってCore Dataのデータ抽出に利用する

本題

FetchRequestをinit内で行う

基本形は、以下のとおりです。

struct HistorySummarySheetView: View {

    @Environment(\.managedObjectContext) private var viewContext
    @FetchRequest private var sessionList: FetchedResults<Sessions>
    
    init() {
        _sessionList = FetchRequest<Sessions>(
            sortDescriptors: []
        )

    }
  1. @FetchRequestプロパティラッパーでCore Dataから取得するデータをSwiftUIのViewに反映させるための変数sessionListを宣言します。
  2. 変数名sessionListの前に_(アンダースコア)をつけることで、プロパティーラッパーにアクセスします。

親Viewから渡された引数を、FetchRequestによってCore Dataのデータ抽出に利用する

先ほどの基本形を使って、具体的な例を見てみましょう。

struct ChildView: View {

    @Environment(\.managedObjectContext) private var viewContext
    @FetchRequest private var sessionList: FetchedResults<Sessions>
    
    init(text: String) {
    
        _sessionList = FetchRequest<Sessions>(
            sortDescriptors: [NSSortDescriptor(keyPath: \Sessions.createdAt, ascending: true)],
            predicate: NSPredicate(format: "content == %@", text),
            animation: .default
        )

    }

上記の例では、親Viewからtextという文字鉄を受け取って、init内で以下の条件のデータを抽出してsessionListに割り当てています。

  • contenttextに一致する

まとめ

  • FetchRequestをinit内で行う
  • 親Viewから渡された引数を、FetchRequestによってCore Dataのデータ抽出に利用する

Discussion