根据新的Core Data变化,Xcode为我生成了这个子类:
extension Person {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Person> {
return NSFetchRequest<Person>(entityName: "Person");
}
@NSManaged public var name: String?
}
然后在代码中我希望这一行有效:
let fr = Person.fetchRequest()
然而,上面这行代码给出了一个错误:
"Ambiguous use of 'fetchRequest'
这解决了问题:
let fr: NSFetchRequest<Person> = Person.fetchRequest()
那么,我感到困惑的是:
NSFetchRequest<Person>
中的:
@nonobjc public class func fetchRequest() -> NSFetchRequest<Person> {
返回类型在做什么?
不应该返回类型允许我不必指定:
NSFetchRequest<Person>
let fr: NSFetchRequest<Person> = Person.fetchRequest()
任何人都可以帮助我理解为什么它需要它,即使它已经是返回类型的一部分了吗?
答案 0 :(得分:19)
发生这种情况的原因是fetchRequest
类中有两个名为Person
的方法:
Person
)中,返回类型为NSFetchRequest<Person>
NSManagedObject
,返回类型为NSFetchRequest<NSFetchRequestResult>
这就是为什么它不明确,编译器不知道你指的是哪2个。如果您将Person+CoreDataProperties
中的func名称从fetchRequest
重命名为personFetchRequest
并按名称调用 - 它就会像那样编译。
更好 - 只需向您的Person+CoreDataClass
添加另一个具有不同名称的函数,该函数将返回Person.fetchRequest()
,并且在使用该名称进行调用时无需进行强制转换。
答案 1 :(得分:17)
由于fetchRequest()对于所有实体都是通用的,因此您可以在所有生成的扩展中看到相同的方法,您必须使其具体化。
以下行特定于 YourEntity 类获取请求方法
let fetchRequest: NSFetchRequest<**YourEntity**> = **YourEntity**.fetchRequest()
答案 2 :(得分:3)
原因是通用类型。 NSFetchRequest
已经变成了一个通用的,以避免大量的类型转换。
如果函数没有采用任何参数,那么具体类型(Person
)不能直接传递,返回类型也是通用的,必须明确注释。