Subclass.fetchRequest()Swift 3.0,扩展不是真的帮助100%?

zum*_*zum 28 core-data swift

根据新的Core Data变化,Xcode为我生成了这个子类:

extension Person {

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

    @NSManaged public var name: String?

}
Run Code Online (Sandbox Code Playgroud)

然后在代码中我期待这一行工作:

let fr = Person.fetchRequest()
Run Code Online (Sandbox Code Playgroud)

但是上面这行代码给出了一个错误:

"Ambiguous use of 'fetchRequest'
Run Code Online (Sandbox Code Playgroud)

这解决了这个问题:

let fr: NSFetchRequest<Person> = Person.fetchRequest()
Run Code Online (Sandbox Code Playgroud)

那么,我很困惑的是:

NSFetchRequest<Person>
Run Code Online (Sandbox Code Playgroud)

在里面:

@nonobjc public class func fetchRequest() -> NSFetchRequest<Person> {
Run Code Online (Sandbox Code Playgroud)

返回类型在做什么?

不应该返回类型允许我不必指定:

NSFetchRequest<Person>
Run Code Online (Sandbox Code Playgroud)

在let定义??

let fr: NSFetchRequest<Person> = Person.fetchRequest()
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我理解它为什么需要它,即使它已经是返回类型的一部分了吗?

Dan*_*e P 24

发生这种情况的原因是fetchRequest您的Person类中有两种方法:

  • 首先是在您的模型子类(Person)中返回类型NSFetchRequest<Person>
  • 第二个是NSManagedObject返回类型NSFetchRequest<NSFetchRequestResult>

这实际上是为什么它是模棱两可的,编译器不知道你指的是哪两个.如果您在重命名FUNC名Person+CoreDataProperties来自fetchRequestpersonFetchRequest和这个名字叫-它会编译就是这样.

甚至更好 - 只需添加另一个func,Person+CoreDataClass使用不同的名称,这将返回Person.fetchRequest(),并且您在调用该名称时不需要进行强制转换.


Dev*_*esh 18

由于fetchRequest()对于所有实体都是通用的,因此您可以在所有生成的扩展中看到相同的方法,您必须使其具体化.

下面的行特定于YourEntity类获取请求方法

let fetchRequest: NSFetchRequest<**YourEntity**> = **YourEntity**.fetchRequest()
Run Code Online (Sandbox Code Playgroud)