Swift NSManagedObject.entity()-未初始化
我对CoreData有意见。我有一个这样的通用函数,看起来是这样的: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
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)