Swift NSManagedObject.entity()-未初始化

Swift NSManagedObject.entity()-未初始化,swift,generics,core-data,nsmanagedobject,Swift,Generics,Core Data,Nsmanagedobject,我对CoreData有意见。我有一个这样的通用函数,看起来是这样的: func fetchRequest<T : NSManagedObject>() -> NSFetchRequest<T>? { let entity = T.entity() guard let entityName = entity.name else { return nil } let request = NSFetchRequest<T>(entity

我对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
}
这很有趣,因为
NSManagedObject.entity()
返回一个非可选的
NSEntityDescription

没有关于何时失败的规则-例如,当我在一个循环中调用这个函数5次时,它可以在前两次工作,然后在第三次失败。也没有关于实体类的规则

我还试过别的东西

extension NSManagedObject
{
    class func concreteFetchRequest<T>() -> NSFetchRequest<T>
    {
        let entityName = String(describing: self)
        return NSFetchRequest(entityName: entityName)
    }
}
但是,如果我修改代码,直接从
ConcreteNSManagedObjectSubclass
在最顶端创建一个
NSFetchRequest
,并将其向下传递,那么它总是有效的

func theTop()
{
    let fetchRequest : NSFetchRequest<ConcreteNSManagedObjectSubclass> = ConcreteNSManagedObjectSubclass.concreteFetchRequest()
    let instance : ConcreteNSManagedObjectSubclass = firstOrCreated(fetchRequest) // works fine
}
func theTop()
{
let fetchRequest:NSFetchRequest=ConcreteNSManagedObjectSubclass.concreteFetchRequest()
让实例:ConcreteNSManagedObjectSubclass=firstOrCreated(fetchRequest)//工作正常
}
在我看来,这似乎是一个Swift编译器错误,它无法将参数
t
解析为具体类型,因此它转而使用
NSManagedObject
——但如果是这样,它甚至不应该编译。还是我做错了什么?

请更换:

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

let request=T.Type.fetchRequest()作为NSFetchRequest

let request=NSFetchRequest(entityName:entityName)
无论您喜欢哪个。

existingEntities()都是T的泛型。在firstOrCreated()方法中,您可以通过“if let existingEntities()”的方式调用existingEntities()。在existingEntities()的调用站点中,您没有提供足够的信息来解析该方法的泛型“T”。里面有打字错误吗?
func theTop()
{
    let fetchRequest : NSFetchRequest<ConcreteNSManagedObjectSubclass> = ConcreteNSManagedObjectSubclass.concreteFetchRequest()
    let instance : ConcreteNSManagedObjectSubclass = firstOrCreated(fetchRequest) // works fine
}
let request = NSFetchRequest<T>(entityName: entityName)
let request = T.Type.fetchRequest() as NSFetchRequest<T>
let request = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)