Subclass.fetchRequest() Swift 3.0, extension not r

2020-08-09 04:47发布

问题:

according to the new Core Data changes, Xcode generates this subclass for me:

extension Person {

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

    @NSManaged public var name: String?

}

then in code I was expecting to have this one line working:

let fr = Person.fetchRequest()

This line of code above however gives me an error:

"Ambiguous use of 'fetchRequest'

This fixes the issue:

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

So then, I am confused what is the:

NSFetchRequest<Person>

in the:

@nonobjc public class func fetchRequest() -> NSFetchRequest<Person> {

return type doing at all?

Shouldn't the return type allow me not to have to specify the:

NSFetchRequest<Person>

in the let definition??

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

Can anybody help me understand why it is needed even though it's part of the return type already?

回答1:

The reason this is happening is there are two methods named fetchRequest in your Person class:

  • first is in your model subclass (Person) with return type NSFetchRequest<Person>
  • second is in NSManagedObject with return type NSFetchRequest<NSFetchRequestResult>

That's actually why it is ambiguous, compiler does not know which out of 2 you refer to. If you rename func name in your Person+CoreDataProperties to from fetchRequest to personFetchRequest and call by that name - it would compile just like that.

Even better - just add another func to your Person+CoreDataClass with different name, which would return Person.fetchRequest(), and you won't need to cast when calling by that name.



回答2:

Because fetchRequest() is generic for all entity,you can see same method in all your generated extensions , you have to make it specific .

Below line is specific to YourEntity class fetch request method

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


回答3:

The reason is the generic type. NSFetchRequest has been turned into a generic to avoid a lot of type casting.

If the function doesn't take any parameter so the concrete type (Person) cannot be passed directly and the return type is also a generic it must be annotated explicitly.