例によるSwiftUI(SwiftUI by Example)15 Data

SwiftUIでコアデータを使用するための概要
Introduction to using Core Data with SwiftUI

NSManagedObjectObservableObjectプロトコルに準拠しています。つまり、任意のオブジェクトをユーザーインターフェイスの一部にバインドできます。
managedObjectContextアクティブなCoreData管理対象オブジェクトコンテキストを格納するように設計された環境にはキーがあります。
次に、Xcodeのテンプレートは、そのコンテキストをシーンデリゲート内の最初のコンテンツビューに挿入します。
@FetchRequest環境の管理対象オブジェクトコンテキストを使用してフェッチ要求を実行するプロパティラッパーがあります。
そのため、アプリの起動時に管理対象オブジェクトコンテキストを作成し、それをビューの環境にアタッチしてから、を使用@FetchRequestしてアプリが使用するデータを読み込みます。

SwiftUIで動作するようにCoreDataを構成する方法
How to configure Core Data to work with SwiftUI

旧AppDelegate版のため以下を参考。
Day 53: Xcode 12 beta 3/ beta 4 and Core Data, impossible to select coredata checkbox
53日目:Xcode12ベータ3 /ベータ4およびCoreData、coredataチェックボックスを選択できません

import SwiftUI
import CoreData

public class PersistentCloudKitContainer {
    // MARK: - Define Constants / Variables
    public static var context: NSManagedObjectContext {
        return persistentContainer.viewContext
    }
    // MARK: - Initializer
    private init() {}
    // MARK: - Core Data stack
    public static var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "Bookworm")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        container.viewContext.automaticallyMergesChangesFromParent = true
        container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
        return container
    }()
    // MARK: - Core Data Saving support
    public static func saveContext () {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }
}

@main
struct BookwormApp: App {
    let context = PersistentCloudKitContainer.persistentContainer.viewContext
    var body: some Scene {
        WindowGroup {
            ContentView().environment(\.managedObjectContext, context)
        }
    }
}

@FetchRequestを使用してCoreDataフェッチリクエストを作成する方法
How to create a Core Data fetch request using @FetchRequest

述語を使用してCoreDataフェッチ要求をフィルタリングする方法
How to filter Core Data fetch requests using a predicate

SwiftUIビューからCoreDataオブジェクトを追加する方法
How to add Core Data objects from SwiftUI views

SwiftUIビューからCoreDataオブジェクトを削除する方法
How to delete Core Data objects from SwiftUI views

import SwiftUI
import CoreData

public class PersistentCloudKitContainer {
    // MARK: - Define Constants / Variables
    public static var context: NSManagedObjectContext {
        return persistentContainer.viewContext
    }
    // MARK: - Initializer
    private init() {}
    // MARK: - Core Data stack
    public static var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "ProgrammingLanguage")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        container.viewContext.automaticallyMergesChangesFromParent = true
        container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
        return container
    }()
    // MARK: - Core Data Saving support
    public static func saveContext () {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }
}

@main
struct SwiftUITestApp: App {
    let context = PersistentCloudKitContainer.persistentContainer.viewContext
    var body: some Scene {
        WindowGroup {
            ContentView().environment(\.managedObjectContext, context)
        }
    }
}


//-----------------------------------
//-----------------------------------
struct ContentView : View {
    @Environment(\.managedObjectContext) var managedObjectContext
    
    @FetchRequest(
        entity: PLEntity.entity(),
        sortDescriptors: [
            //NSSortDescriptor(keyPath: \PLEntity.name, ascending: false),
            //NSSortDescriptor(keyPath: \PLEntity.creator, ascending: false)
            NSSortDescriptor(keyPath: \PLEntity.name, ascending: true)
               
        ]
        //predicate: NSPredicate(format: "name == %@", "Python")
        
    )
    var languages: FetchedResults<PLEntity>
    
    func removeLanguages(at offsets: IndexSet) {
        for index in offsets {
            let language = languages[index]
            managedObjectContext.delete(language)
        }
        do {
            try managedObjectContext.save()
        } catch {
            // handle the Core Data error
        }
    }
    
    var body: some View {
        NavigationView {
            VStack{
                //-------------------------------
                Button(action: {
                    let language1 = PLEntity(context: self.managedObjectContext)
                    language1.name = "Python"
                    language1.creator = "Guido van Rossum"
                    
                    let language2 = PLEntity(context: self.managedObjectContext)
                    language2.name = "Bird"
                    language2.creator = "abcdefghijklmnopqrstuv"
                    
                    // more code here
                    if self.managedObjectContext.hasChanges {do {
                        try self.managedObjectContext.save()
                        } catch {
                            // handle the Core Data error
                        }
                    }
                }) {
                    Text("Insert example language")
                }
                //-------------------------------
                List {
                    ForEach(languages, id: \.self) { language in
                        Text("Creator: \(language.name ?? "name")")
                        Text("Creator: \(language.creator ?? "Anonymous")")
                    }.onDelete(perform: removeLanguages)
                }
                //-------------------------------
            }
            .navigationBarTitle(Text("SwiftUI"))
            .navigationBarItems(trailing: EditButton())
        }
    }
}
//-----------------------------------
//-----------------------------------
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        let context = PersistentCloudKitContainer.persistentContainer.viewContext
        //ContentView()
        return ContentView().environment(\.managedObjectContext, context)
    }
}



FileDocumentとDocumentGroupを使用してドキュメントベースのアプリを作成する方法
How to create a document-based app using FileDocument and DocumentGroup

動作不可 おそらく、appleの仕様変更?

参考サイト
忙しい人向けの Build document-based apps in SwiftUI – #WWDC20
以下サイトのリンクは動作!!
FileDocument | ReferenceFileDocument – SwiftUI

ExportFilesActionを使用してファイルをエクスポートする方法
How to export files using ExportFilesAction

SwiftUIでのファイルのインポートとエクスポート

掲載情報だけでは動作不可

以下 参考サイト
WWDC 2020で、SwiftUIは、新しい@Environment変数を使用して、アプリケーションとの間でデータをインポートおよびエクスポートするための機能を導入しました。これらの新しい追加はSwiftUIの歓迎すべき改善ですが、少し不格好です。iOS 14ベータ6のリリースに伴い、Appleはインポートとエクスポートの摩擦を減らす新しいビュー修飾子のセットを提供してくれました。

githubダウンロード版もそのままで動作不可
SwiftUIでのファイルのインポートとエクスポート

SwiftUIでNSUserActivityを継続する方法
How to continue an NSUserActivity in SwiftUI

SwiftUIには、Webからのクリック、SpotlightまたはSiriからの起動などonContinueUserActivity()、さまざまなNSUserActivityタイプをキャッチできる専用の修飾子があります。

今後の宿題