WWDC2019 Session 204 - 使用 Identifiable 协议的数据源的核心数据

jsp*_*cer 5 core-data swift

在 WWDC19 session 204 上展示了如何使用 Swift 5.1 和List函数构建 UI 。我想使用核心数据而不是数据文件。问题是核心数据实体不符合 Identifiable 协议。

我在网上广泛搜索并观看了几个核心数据视频,但它们都已过时。它们都没有涵盖 Swift 5.1 和新的 beta 功能(如List)。

我创建了一个包含一些字段的实体(名称,id -> 这是一个 UUID)。然后我手动生成如下所示的源文件:

AccountsMO+CoreDataClass.swift

import Foundation
import CoreData


public class AccountsMO: NSManagedObject
{

}
Run Code Online (Sandbox Code Playgroud)

并且AccountsMO+CoreDataProperties.swift

import Foundation
import CoreData


extension AccountsMO
{

    @nonobjc public class func fetchRequest() -> NSFetchRequest<AccountsMO>
    {
        return NSFetchRequest<AccountsMO>(entityName: "Accounts")
    }

    @NSManaged public var balance: NSDecimalNumber?
    @NSManaged public var id: UUID
    @NSManaged public var name: String
    @NSManaged public var type: Int16

}
Run Code Online (Sandbox Code Playgroud)

这些工作,但我不能在 List 中使用它们,因为它们不符合可识别协议。我假设有某种方法可以添加它,但我在核心数据实体或此处都找不到它。

我将我的数据加载到ContentView文件中并尝试在列表中使用它。根据我的尝试,我得到要么'无法推断复杂的闭包返回类型;添加显式类型以消除歧义',或者我得到'不符合可识别协议'

jla*_*jla 4

来自SwiftUI 教程

列表与可识别数据一起使用。您可以通过以下两种方式之一使您的数据可识别:通过使用唯一标识每个元素的属性的关键路径调用identified(by:)方法,或者使您的数据类型符合可识别协议。

由于 AccountsMO 类型已经具有可识别协议所需的 id 属性,只需声明与可识别协议的一致性。

import SwiftUI

extension AccountsMO: Identifiable {

}
Run Code Online (Sandbox Code Playgroud)