【问题标题】:Subclass.fetchRequest() Swift 3.0, extension not really helping 100%?Subclass.fetchRequest() Swift 3.0,扩展并没有真正帮助 100%?
【发布时间】:2017-01-22 12:58:43
【问题描述】:

根据新的 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 定义中??

let fr: NSFetchRequest<Person> = Person.fetchRequest()

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

【问题讨论】:

  • 我理解这里提到的答案的推理,但我不明白,为什么苹果会添加非编译代码! /咆哮

标签: swift core-data


【解决方案1】:

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

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

let fetchRequest: NSFetchRequest<**YourEntity**> = **YourEntity**.fetchRequest()

【讨论】:

    【解决方案2】:

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

    • first 在您的模型子类 (Person) 中,返回类型为 NSFetchRequest&lt;Person&gt;
    • 第二个在NSManagedObject,返回类型为NSFetchRequest&lt;NSFetchRequestResult&gt;

    这实际上是它模棱两可的原因,编译器不知道您指的是哪一个。如果您将 Person+CoreDataProperties 中的 func 名称从 fetchRequest 重命名为 personFetchRequest 并以该名称调用 - 它会像这样编译。

    更好 - 只需将另一个具有不同名称的函数添加到您的 Person+CoreDataClass,这将返回 Person.fetchRequest(),并且您在使用该名称调用时不需要强制转换。

    【讨论】:

      猜你喜欢
      • 2020-04-02
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      相关资源
      最近更新 更多