【SwiftUI】Core Dataの使い方:検索編(2/3)

検索条件を動的に変更する方法を解説します。
【SwiftUI】Core Dataの使い方:検索編(1/3)の続編です。

スポンサーリンク

環境

この記事の情報は次のバージョンで動作確認しています。

【Xcode】12.4
【Swift】5.3.2
【iOS】14.4
【macOS】Big Sur バージョン 11.1
スポンサーリンク

はじめに

前記事の【SwiftUI】Core Dataの使い方:検索編(1/3)では、次のようなプロパティラッパー(@FetchRequest)を使った検索方法を紹介しました。

抽出条件の"A"の部分を、他のプロパティを参照するように変更すれば、検索条件を動的に変えられそうです。

しかし実際に試してみると、次のようなエラーが発生します。

Cannot use instance member 'nameOfClass' within property initializer; property initializers run before 'self' is available

構造体のプロパティとして作成される @FetchRequest は、Swiftの制限により他のプロパティを参照する事ができないのです。

解決策

この記事では、検索を伴う機能を別のViewに切り分けて、そこに検索キーを渡す方法を紹介します。
切り分けたViewでは、渡された検索キーを使ってイニシャライザでFetchRequestを動的に生成可能となります。

スポンサーリンク

実現したい機能

生徒一覧の上部にPickerでクラスの選択ボタンを配置し、選択したクラスの生徒一覧が表示されるようにします。

Image001

スポンサーリンク

呼び出し側(ContentView)の構成

前回の記事で作成したContentViewを次のように変更します。

VStackで画面の上部にクラスを選択するPicker部品を、下部には生徒一覧を表示するカスタムView(StudentsList)を配置します。
カスタムViewの引数(nameOfClass)には、選択したクラス名を渡します。

スポンサーリンク

生徒一覧表示View

次のようなカスタムView(StudentsList.swift)をプロジェクトに新規追加します。

FetchRequest保存用プロパティ

@FetchRequestは使用せず、代わりにカスタムFetchRequestを保存する次のようなプロパティを宣言します。

FetchRequestの生成

イニシャライザの引数で受け取った検索キーを使って、FetchRequestを生成します。

検索結果の取得

検索結果を取得する場合は、次のようにfetchRequestのwrappedValueを使ってデータを引き出す必要があります。

wrappedValueを使うのが嫌ならば、次のように単純な計算プロパティを作ってもよいでしょう。

スポンサーリンク

合わせて読みたい記事

【SwiftUI】Core Dataの使い方:標準テンプレートを読み解く
(2023/03/25 更新) SwiftUIでのCore Dataの使い方を、標準テンプレートを読み解きながら解説します。
【SwiftUI】Core Dataの使い方:エンティエィ(Entity)を定義する
(2021/04/26 更新) Xcodeでエンティティを定義する方法を解説します。
【SwiftUI】Core Dataの使い方:準備編
SwiftUIでCore Dataを扱うための前提知識と、新規プロジェクトの作成方法について解説します。
【SwiftUI】Core Dataの使い方:基本編
SwiftUIでCore Dataの基本的な使い方を簡単なTodoリストアプリを例に解説します。
【SwiftUI】Core Dataの使い方:検索編(1/3)
データベースを検索して、オブジェクトとして取得するfetch処理について解説します。 を先に見ておくことをおすすめします。
【SwiftUI】Core Dataの使い方:検索編(3/3)
前の2つの記事 では、SwiftUIの特徴であるデータバインディングの仕組みを使い、検索結果とViewを紐付ける方法を紹介しました。これにより、検索結果に応じてViewが自動で再描画されます。 しかし、検索結果を別の処理のインプットに使う場...
【SwiftUI】Core Dataの使い方:リレーションシップ編
リレーションシップを使ってエンティティ同士をリンクする方法を解説します。