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?
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.
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()
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.