[Swift・CoreData]プレビューでPersistenceControllrのインスタンスが何故か使えません。
プレビューでPersistenceControllrのインスタンスが何故か使えません。
Swift初学者です。以下のソースコードで、プレビューを表示させようと試みたのですがうまくいきません。
プレビューに「Instance member 'persistenceController' cannot be used on type 'ContentView_Previews'」とエラーが出ます。
構造体ContentView_PreviewsのメンバのpersistenceControllerがここでは使えないとのことですが、具体的な解決策が提示されていません。
ちなみにデータベース名?は「PetShop.xcdatamodeld」、エンティティ名は「Cat」、属性は「name(String)」のみとなっています。
import SwiftUI
import CoreData
struct ContentView: View {
@Environment(\.managedObjectContext) var viewContext
@FetchRequest(sortDescriptors: [])
var Results: FetchedResults<Cat>
var body: some View {
VStack {
ForEach(Results) { result in
Text(result.name!).padding()
}
}
}
}
struct PersistenceController {
static var preview = PersistenceController()
let container: NSPersistentContainer
init() {
container = NSPersistentContainer(name: "PetShop")
container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
container.loadPersistentStores(completionHandler: {(description, nsError) in
if let _ = nsError as NSError? {
fatalError()
}
})
let viewContext = container.viewContext
for num in 1...3 {
let newCat = Cat(context: viewContext)
newCat.name = "ネコ\(num)"
}
do {
try viewContext.save()
} catch {
fatalError()
}
}
}
struct ContentView_Previews: PreviewProvider {
let persistenceController = PersistenceController()
static var previews: some View {
// この部分がエラーになります。
ContentView().environment(\.managedObjectContext, persistenceController.container.viewContext)
}
}
しかし、PreviewProviderのコードを以下のように書き換えるとうまくいきます。
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
}
}
私がソースコードを見る限り、一つ目はPersistenceControllerのインスタンスをContentView_Previewsで作成し、使用している。二つ目は、引数で環境変数の設定?で引数として使用されるときに、即時関数としてインスタンスを作成し、使用している。
このように認識していて、一つ目も二つ目も実際は同じことをやっているようにしか思えないのですが、なぜ一つ目のコードではうまくプレビューが表示されないのでしょうか?