gpt4 book ai didi

swift - NSManagedObject.entity() - 未初始化

转载 作者:行者123 更新时间:2023-12-02 04:22:46 28 4
gpt4 key购买 nike

我遇到了 CoreData 的问题。我有一个像这样的通用函数:

func fetchRequest<T : NSManagedObject>() -> NSFetchRequest<T>?
{
let entity = T.entity()
guard let entityName = entity.name else { return nil }
let request = NSFetchRequest<T>(entityName: entityName)
return request
}

没有理由它不应该工作 - 在大多数情况下它没有问题。但是,有时我的函数返回 nil .当我调试它时,我得到了最有趣的结果:
(lldb) po entity
<uninitialized>

这很有趣,因为 NSManagedObject.entity()返回非可选 NSEntityDescription
没有关于何时失败的规则 - 例如,当我在循环中调用此函数 5 次时,它可以运行前两次,然后第三次失败。也没有关于实体类的规则。

我也尝试过其他的东西。
extension NSManagedObject
{
class func concreteFetchRequest<T>() -> NSFetchRequest<T>
{
let entityName = String(describing: self)
return NSFetchRequest(entityName: entityName)
}
}

大多数时候也可以,但有时

po entityName
NSManagedObject



尽管被混凝土使用 NSManagedObject子类。当这个通用函数被用于一系列其他通用函数时,就会出现这个错误,就像这样
func theTop()
{
let instance : ConcreteNSManagedObjectSubclass = firstOrCreated() // "Entity description for entity name NSManagedObject not found"
}

func firstOrCreated<T: NSManagedObject>() -> T
{
let entity : T
if let existingEntities() {
// do stuff
}
// do other stuff
}

func existingEntities<T: NSManagedObject>() -> [T]?
{
guard let request : NSFetchRequest<T> = fetchRequest() else
{ return [] }
// do stuff
}

func fetchRequest<T : NSManagedObject>() -> NSFetchRequest<T>?
{
let entity = T.entity()
guard let entityName = entity.name else { return nil }
let request = NSFetchRequest<T>(entityName: entityName)
return request
}

但是,如果我修改代码以创建 NSFetchRequest在最顶部,直接来自 ConcreteNSManagedObjectSubclass并将其传递下去 - 它始终有效。
func theTop()
{
let fetchRequest : NSFetchRequest<ConcreteNSManagedObjectSubclass> = ConcreteNSManagedObjectSubclass.concreteFetchRequest()
let instance : ConcreteNSManagedObjectSubclass = firstOrCreated(fetchRequest) // works fine
}

对我来说,这看起来像是一个 Swift 编译器错误,就像它无法解析参数 T到具体类型,所以它回落到 NSManagedObject相反 - 但如果是这样的话,那甚至不应该编译。还是我做错了什么?

最佳答案

请更换:

let request = NSFetchRequest<T>(entityName: entityName)

和:
let request = T.Type.fetchRequest() as NSFetchRequest<T>

或者
let request = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)

随你喜欢。

关于swift - NSManagedObject.entity() - 未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58323394/

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