我有这个协议(protocol):
protocol ManagedObjectProtocol {
associatedtype Entity
static var identifierKey: String { get }
static func fetchRequest() -> NSFetchRequest<NSFetchRequestResult>
func toEntity() -> Entity?
}
我确认我的一些 NSManagedObject 类的扩展如下:
extension AppEntity: ManagedObjectProtocol {
typealias Entity = App
static var identifierKey: String {
return "articleId"
}
func toEntity() -> Entity? {
return nil
}
}
当我尝试使用新的 Xcode 13 存档时,出现此错误:
Type 'AppEntity' does not conform to protocol 'ManagedObjectProtocol'
但是当我尝试在我的设备上运行此代码时,它构建得很好。
使用 Xcode 12 和旧版本可以正常构建/归档,但是使用新的 Xcode 13(和 Xcode 13.1)我遇到了问题。哪里可能有问题?我该如何修复它?
还有一件事是我在归档时遇到错误,而不是在调试构建时遇到错误。我在获取实体之前有以下代码:
func get<Entity: NSManagedObject>
(with predicate: NSPredicate? = nil,
sortDescriptors: [NSSortDescriptor]? = nil,
fetchLimit: Int? = nil,
inContext context: NSManagedObjectContext? = nil,
completion: @escaping (Result<[Entity], Error>) -> Void) {
if let ctx = context {
coreData.performTask({ (context) in
do {
let fetchRequest = Entity.fetchRequest()
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = sortDescriptors
if let fetchLimit = fetchLimit {
fetchRequest.fetchLimit = fetchLimit
}
let results = try context.fetch(fetchRequest) as? [Entity]
completion(.success(results ?? []))
} catch {
completion(.failure(error))
}
}, inContext: ctx)
} else {
coreData.performForegroundTask { context in
do {
let fetchRequest = Entity.fetchRequest()
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = sortDescriptors
if let fetchLimit = fetchLimit {
fetchRequest.fetchLimit = fetchLimit
}
let results = try context.fetch(fetchRequest) as? [Entity]
completion(.success(results ?? []))
} catch {
completion(.failure(error))
}
}
}
}
我收到这些错误消息:
Type 'Entity' has no member 'fetchRequest'
怎么了?归档时如何修复这些核心数据错误?
感谢帮助
编辑:
再一个帮助程序方法的示例,其中我遇到 no member fetchRequest
错误:
func count(entity: NSManagedObject.Type,
with predicate: NSPredicate? = nil,
fetchLimit: Int? = nil,
completion: @escaping (Result<Int, Error>) -> Void) {
coreData.performForegroundTask { context in
do {
let fetchRequest = entity.fetchRequest()
fetchRequest.predicate = predicate
if let fetchLimit = fetchLimit {
fetchRequest.fetchLimit = fetchLimit
}
let count = try context.count(for: fetchRequest)
completion(.success(count))
} catch {
completion(.failure(error))
}
}
}
最佳答案
我遇到了同样的编译错误。 我找不到编译错误原因,但我认为这是解决方法之一:
if let entityName = Entity.entity().name {
let request = NSFetchRequest<Entity>(entityName: entityName)
....
}
关于swift - 使用新 Xcode 13 存档时出现核心数据错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69719581/