Подтвердить что ты не робот

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

Может кто-нибудь помочь мне понять, почему это необходимо, даже если часть возвращаемого типа уже существует?

4b9b3361

Ответ 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) не может быть передан напрямую, а тип возврата также является общим, он должен быть явно аннотирован.