在Swift 3和Core Data中转换为fetchRequest

时间:2016-11-22 21:45:40

标签: ios swift core-data nsfetchedresultscontroller nsfetchrequest

我使用Swift 3,核心数据和NSFetchedResultsController,我被迫做以下事情:

let fetchRequest = Project.fetchRequest() as! NSFetchRequest<Project>

为什么我不能写let fetchRequest = Project.fetchRequest()?我看到Project.fetchRequest返回NSFetchRequest<NSFetchRequestResult>,但由于我使用NSFetchRequest<Project>实体,因此无法推断Project

当然,我可以写

let fetchRequest = NSFetchRequest<Project>(entityName: "Project")

但我想避免使用字符串作为实体名称。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

NSManagedObject 中有一个方法:

class func fetchRequest() -> NSFetchRequest<NSFetchRequestResult>

如果对模型对象使用自动代码生成,那么每个生成的类都会有一个方法:

@nonobjc public class func fetchRequest() -> NSFetchRequest<ClassName> {
   return NSFetchRequest<ClassName>(entityName: "EntityName")
}

例如,如果您有以下模型层次结构:

Animal
- Cat
- Dog

然后XCode会生成如下方法:

// for Animal model object
@nonobjc public class func fetchRequest() -> NSFetchRequest<Animal> {
   return NSFetchRequest<Animal>(entityName: "Animal")
}

// for Cat model object
@nonobjc public class func fetchRequest() -> NSFetchRequest<Cat> {
   return NSFetchRequest<Cat>(entityName: "Cat")
}

// for Dog model object
@nonobjc public class func fetchRequest() -> NSFetchRequest<Dog> {
   return NSFetchRequest<Dog>(entityName: "Dog")
}

在这种情况下,当您编写 Cat.fetchRequest() 时,编译器不知道选择 3 个重载中的哪一个。

  1. 此请求将返回所有动物、猫和狗:
let request: NSFetchRequest<Animal> = Cat.fetchRequest()
  1. 此请求将仅返回猫:
let request: NSFetchRequest<Cat> = Cat.fetchRequest()
  1. 此查询将返回所有动物、猫和狗,但不会输入结果:
let request: NSFetchRequest<NSFetchRequestResult> = Cat.fetchRequest()

答案 1 :(得分:0)

简短回答:如果您为核心数据实体使用标准生成的类,请使用:

   ERROR:  could not open extension control file "/usr/pgsql-12/share/extension/pltcl.control": No 
   such file or directory

您必须将 shiwangini1=# CREATE language pltcl; ERROR: could not access file "$libdir/pltcl": No such file or directory 对象强制转换为特定的实体类,否则 Swift 不知道请求的结果类型。