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

时间:2016-09-14 16:13:54

标签: swift core-data

根据新的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()

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

3 个答案:

答案 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)不能直接传递,返回类型也是通用的,必须明确注释。