我正在为我的Swift应用程序构建通用API。我使用CoreData
进行本地存储,使用CloudKit
进行云同步。
为了能够在通用函数中处理我的数据对象,我将它们组织如下(简要概述):
- 进入
CoreData
数据库的对象是符合ManagedObjectProtocol
协议的NSManagedObject
实例,该协议使其可以转换为DataObject
实例 - 需要云同步的
NSManagedObject
符合名为CloudObject
的协议,该协议允许从记录中填充对象,反之亦然 - 我在应用程序图形层中使用的对象是符合
DataObject
协议的NSObject类,该协议允许将其转换为NSManagedObject
实例
一个特定类的对象。我想让这段代码看起来像这样:
for record in records {
let context = self.persistentContainer.newBackgroundContext()
//classForEntityName is a function in a custom extension that returns an NSManagedObject for the entityName provided.
//I assume here that recordType == entityName
if let managed = self.persistentContainer.classForEntityName(record!.recordType) {
if let cloud = managed as? CloudObject {
cloud.populateManagedObject(from: record!, in: context)
}
}
}
然而,这给我带来了几个错误:
Protocol 'CloudObject' can only be used as a generic constraint because it has Self or associated type requirements
Member 'populateManagedObject' cannot be used on value of protocol type 'CloudObject'; use a generic constraint instead
云对象协议如下所示:
protocol CloudObject {
associatedtype CloudManagedObject: NSManagedObject, ManagedObjectProtocol
var recordID: CKRecordID? { get }
var recordType: String { get }
func populateManagedObject(from record: CKRecord, in context: NSManagedObjectContext) -> Promise<CloudManagedObject>
func populateCKRecord() -> CKRecord
}
一些方式可以让我根据收到的 `recordType` 找到符合 `CloudObject` 的具体类。最好的方法是什么?
非常感谢您的帮助!
Promise<CloudManagedObject>
吗?例如,它不能是像Promise<NSManagedObject & ManagedObjectProtocol>
这样的东西吗?实现你想要的一种方法是从你的CloudObject
中删除associatedtype
。 - OOPer