swift WWDC 2019会议204 -使用核心数据作为具有可识别协议的数据源

vecaoik1  于 2023-01-01  发布在  Swift
关注(0)|答案(3)|浏览(241)

在WWDC19第204次会议上,我们展示了如何使用Swift 5.1和List函数构建UI。我想使用 * Core Data * 而不是拥有数据文件。问题是核心数据实体不符合Identifiable协议。
我在网上搜索了很多,看了几个核心数据视频,但都过时了,没有一个涉及Swift 5.1和新的beta函数(比如List)。
我创建了一个带有一些字段的实体(name,id-〉这是一个UUID),然后手动生成如下所示的源文件:

    • x一个月两个月一个月:**
import Foundation
import CoreData

public class AccountsMO: NSManagedObject
{

}

以及**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

}

这些可以工作,但我不能在List中使用它们,因为它们不符合Identifiable协议。我假设有某种方法可以添加这些,但我找不到它,无论是在核心数据实体中还是在这里。
我在ContentView文件中加载了我的数据,并尝试在列表中使用它。根据我的尝试,我得到了 '无法推断复杂闭包返回类型;添加显式类型以消除""的歧义,或者我得到的""不符合可标识协议""。

yh2wf1be

yh2wf1be1#

SwiftUI Tutorials开始
列表使用可标识数据。您可以使用以下两种方法之一来标识数据:通过调用identified(by:)方法,该方法带有指向唯一标识每个元素的属性的键路径,或者通过使数据类型符合Identifiable协议。
由于AccountsMO类型已经具有可识别协议所需的id属性,因此只需声明符合可识别协议。

import SwiftUI

extension AccountsMO: Identifiable {

}
jk9hmnmh

jk9hmnmh2#

在SwiftUI列表中将Self作为id参数传递

var entries : [AccountsMO]
List(entries, id : \.self) {_ in

}
xqk2d5yq

xqk2d5yq3#

Core Data代码生成器将对象声明为可标识的(至少在Xcode 14中),因为Core Data对象有自己的ObjectIdentifier。
账户MO+核心数据属性.swift:

extension AccountsMO : Identifiable {

}

如果手动写入Core Data文件,则可以执行相同的操作。

相关问题