swift - 使用新 Xcode 13 存档时出现核心数据错误

标签 swift objective-c core-data protocols xcode13

我有这个协议(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/

相关文章:

swift - 如何在 NSPredicates 中将 AND 与 ANY 结合使用,同时保持高效

objective-c - 对核心数据对象的引用应该是强引用还是弱引用?

ios - 将对象表 IndexPath 设置为对象属性?

swift - 为什么没有 swift 收到委托(delegate)事件?

ios - 如何正确使用 NSTimer 来创建自动幻灯片放映

swift - 如何在 Swift 中初始化双向图?

objective-c - 定义可由所有类使用的应用程序全局变量的最简单方法是什么?

objective-c - 我如何多次调用一个函数,每次调用它时都会改变函数内部的随机数?

ios - 如何从日历中获取所有事件(Swift)

javascript - 更改 objective-c 中 wkwebview 套件中 <br> <div> 和 <span> 的边距