我使用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")
但我想避免使用字符串作为实体名称。谢谢你的帮助!
答案 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 个重载中的哪一个。
let request: NSFetchRequest<Animal> = Cat.fetchRequest()
let request: NSFetchRequest<Cat> = Cat.fetchRequest()
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 不知道请求的结果类型。