【发布时间】:2017-03-30 13:54:19
【问题描述】:
Xcode 8 为您的 NSManagedObject 子类提供了自动生成的 extension,如下所示:
// Animal+CoreDataProperties.swift
import Foundation
import CoreData
extension Animal {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Animal> {
return NSFetchRequest<Animal>(entityName: "Animal");
}
// etc...
}
这很棒,因为我们不再需要硬编码字符串来创建NSFetchRequest 对象。但是,Apple 没有提供引用此方法的协议,也没有提供引用 entityName 本身的协议。
例如,如果我想创建这样的方法:
protocol ManagedObjectType: class {}
extension ManagedObjectType where Self: NSManagedObject {
static func findOrCreate(inContext context: NSManagedObjectContext, matchingPredicate predicate: NSPredicate) -> Self {
// etc...
}
}
...我无法为任何NSManagedObject 子类利用fetchRequest 方法(因为它仅在子类上定义),所以我只剩下自己重新对这些字符串进行硬编码(即使 Xcode 已经这样做了)。
知道解决这个问题的方法吗?我当时在想一些事情:
protocol ManagedObjectType: class {
static func fetchRequest() -> NSFetchRequest<NSFetchRequestResult>
}
extension Animal: ManagedObjectType {}
但这不起作用,因为协议不支持where子句,所以我不能指定Self是NSFetchRequestResult,这意味着当我来使用它时,像这样:
let request: NSFetchRequest<Self> = self.fetchRequest()
... Xcode 给我这个错误:
'fetchRequest' 产生 'NSFetchRequest
',而不是 预期的上下文结果类型'NSFetchRequest '
有人解决过这个问题吗?
【问题讨论】:
标签: ios swift core-data swift3 xcode8