CoreDataを使用して、データを保存したものを、読み込み処理をするための一般的なプログラムは以下のようになります。
import SwiftUI
import CoreData
struct ContentView: View {
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)],
animation: .default)
private var items: FetchedResults<Item>
var body: some View {
NavigationView {
List {
ForEach(items) { item in
NavigationLink (destination: SecondView()){
Text(item.timestamp!, formatter: itemFormatter)
}
}
ポイントとしては、上部の以下3行
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)],
animation: .default)
private var items: FetchedResults<Item>
と、ForEach(items) 処理により、coredataを読み込むループ処理となります。
この、ForEachループ処理が、画面表示のための主処理であれば、これで良いのですが
主処理ではなくて、関数(function)処理の中で、このForEacheループをやろうとした場合、どうなるか皆さんご存知ですか? そして、そのFunction の中にForEach処理を書くとは具体的にどういうことかと言うと。
struct SecondView: View {
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)],
animation: .default)
private var items: FetchedResults<Item>
var body: some View {
VStack {
Text("Second View!!")
}
.onAppear{
db_shori()
}
}
func db_shori(){
ForEach(items) { db in // ← ここで、コンパイルエラーが起こる
// coredata のデータを使って、ここでなにか処理を書く場合
print(db.timestamp)
}
}
上記、ソースで、func の中に書かれた ForEach により
Type ‘()’ cannot conform to ‘AccessibilityRotorContent’
というコンパイルエラーに 必ず なってしまうんです。
エラーの意味は、ForEach を使った場合、それは画面の表示コンテンツに一致しないというエラーになります。VStackとかHStackとかTextとか、そういった画面に表示する命令の中でForEachを使う場合にはエラーにならないのですが、それ以外のFunction内部で、(ただ単にいろいろな内部変数の)処理を行うだけの場合、画面への表示処理が伴わないので、エラーになってしまうようでした。
何、これ、頼むよAppleさん。こんなんじゃ困るしー。
私は、coredataの読み方を、ForEach処理でしか書けない(それしか知らない)んだからー。
と困り果てて、4日間調べ尽くして、ついにわかった解決方法 2/2 へ続く。