Subclass.fetchRequest() Swift 3.0, расширение не помогает 100%?
в соответствии с новыми изменениями 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()
Может кто-нибудь помочь мне понять, почему это необходимо, даже если часть возвращаемого типа уже существует?
Ответы
Ответ 1
Причина в том, что в вашем классе Person
есть два метода с именем fetchRequest
:
- сначала находится в вашем подклассе модели (
Person
) с типом возврата NSFetchRequest<Person>
- second находится в
NSManagedObject
с типом возврата NSFetchRequest<NSFetchRequestResult>
На самом деле, почему это неоднозначно, компилятор не знает, из какого из 2 вы ссылаетесь. Если вы переимете имя func в Person+CoreDataProperties
с fetchRequest
до personFetchRequest
и вызовите это имя - оно будет скомпилировано именно так.
Еще лучше - просто добавьте еще один func к вашему Person+CoreDataClass
с другим именем, которое вернет Person.fetchRequest()
, и вам не нужно будет использовать его при вызове с помощью этого имени.
Ответ 2
Поскольку fetchRequest() является общим для всей сущности, вы можете видеть тот же метод во всех ваших сгенерированных расширениях, вы должны сделать его конкретным.
Ниже строки относится к Тестирование метода запроса выборки класса
let fetchRequest: NSFetchRequest<**YourEntity**> = **YourEntity**.fetchRequest()
Ответ 3
Причина - общий тип. NSFetchRequest
был преобразован в общий, чтобы избежать многого типа.
Если функция не принимает какой-либо параметр, поэтому конкретный тип (Person
) не может быть передан напрямую, а тип возврата также является общим, он должен быть явно аннотирован.