gpt4 book ai didi

swift - 如何使 CoreData 模型符合协议(protocol)?

转载 作者:行者123 更新时间:2023-11-30 10:40:54 25 4
gpt4 key购买 nike

我正在尝试创建一个与持久性框架无关的代码库。即我想要面向协议(protocol)的编程,但我在使用 CoreData 时遇到了困难。

假设我有一个协议(protocol):

public protocol BookItem {
var title: String { get }
var filename: String { get }
var createdAt: Date { get }
var content: BookItemContent? { get }
}

和另一个协议(protocol)

public protocol BookItemContent {
var bookItem: BookItem { get }
var data: Data { get }
}

当我在 CoreData 中创建具体类型时,我可能会:

class CDBookItem: NSManagedObject, BookItem {

@NSManaged public var title: String?
@NSManaged public var filename: String?
@NSManaged public var createdAt: NSDate?
@NSManaged public var content: CDBookItemContent?
}

class CDBookItemContent: NSManagedObject, BookItemContent {

@NSManaged public var data: NSData?
@NSManaged public var bookItem: CDBookItem?
}

我这里有 3 个问题:

1) 现在我有多个具有不同返回类型的属性。 (例如 .content 属性)

如何最好地解决这个问题?最糟糕和肮脏的方法是重命名所有 Core-Data 属性,然后包装它们以使其一致。

我看到的另一种方法是手动生成 NSManagedObject 子类,然后更改 CoreData 代码生成器正在创建的风格,从而删除可选性。尽管如此,我仍然剩下 content: BookItemContentcontent: CDBookItemContent,所以我不知道是否有一种优雅的方式来完成我希望做的事情这里。我希望我可以声明 NSManagedObject 子类符合其预期的协议(protocol)类型,并且编译器会计算出这一点。

2) Core Data codegen 使用“NSObject”类型,而不是现代的等效类型。 (即 NSData 而不是 Data,NSDate 而不是 Date)。我可以修改代码生成文件以删除“NS”并获得免费桥接吗?

3) 是否知道 CoreData 总是在代码生成中创建可选的对象属性,即使您不希望它们如此?解决方案实际上是覆盖手动生成的文件吗?

最佳答案

最后,我发现面向协议(protocol)编程并不完全像 promise 的那样。我希望几乎整个代码库都能以这种方式完成。最后的解决方案是通过必须显式地为协议(protocol)属性编写访问器来包装核心数据模型上的某些属性,从而使 NSManagedObject 子类符合协议(protocol)。即 return myManagedObject.contentObject as!图书项目内容

关于swift - 如何使 CoreData 模型符合协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56814413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com