2016-09-14 11 views
13

zgodnie z nowymi zmianami danych Core, Xcode generuje Podklasa ta dla mnie:Subclass.fetchRequest() Swift 3.0, rozszerzenie naprawdę nie pomaga w 100%?

extension Person { 

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

    @NSManaged public var name: String? 

} 

następnie w kodzie Spodziewałem się mieć tej pracy jedna linia:

let fr = Person.fetchRequest() 

Ta linia kodu powyżej jednak wyskakuje mi błąd:

"Ambiguous use of 'fetchRequest' 

to rozwiązuje problem:

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

Tak więc, jestem zdezorientowany co jest:

NSFetchRequest<Person> 

w:

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

typ zwracany w ogóle robi?

nie powinien zwracany typ pozwala mi nie trzeba określać:

NSFetchRequest<Person> 

w definicji let ??

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

Czy ktoś może mi pomóc zrozumieć, dlaczego jest potrzebny, mimo że jest już częścią typu zwrotu?

Odpowiedz

8

Powodem tak się dzieje to istnieją dwie metody o nazwie fetchRequest w swojej klasie Person:

  • pierwszy jest w twoich podklasa modelu (Person) z typem zwrotu NSFetchRequest<Person>
  • sekunda jest w NSManagedObject z typem zwrotnym: NSFetchRequest<NSFetchRequestResult>

To właśnie dlatego jest niejednoznaczny, kompilator nie wie, które z 2 odwołujesz. Jeśli zmienisz nazwę func name w swoim Person+CoreDataProperties na fetchRequest na personFetchRequest i wywołanie przez tę nazwę - to skompiluje się właśnie tak.

Jeszcze lepiej - po prostu dodaj inny func do swojej nazwy Person+CoreDataClass z inną nazwą, która zwróci Person.fetchRequest(), a nie będziesz musiał rzucać podczas dzwonienia pod tą nazwą.

3

Powód jest ogólny. NSFetchRequest został przekształcony w typowy, aby uniknąć rzucania wielu typów.

Jeśli funkcja nie przyjmuje żadnego parametru, więc typ betonu (Person) nie może zostać przekazany bezpośrednio, a typ zwracany jest również ogólny, należy go wyraźnie zanotować.

+2

ok, więc gdzie utkniesz jest fakt, można powiedzieć, że typ zwracany jest również ogólny, ale to nie znaczy NSFetchRequest i nie NSFetchRequest , więc wydaje się, że osoba już wywieść ... – zumzum

+0

I napisał: ** Jeśli ** ... typem powrotu jest .. rodzajowy, to musi być opatrzony adnotacją. – vadian

9

Ponieważ fetchRequest() ma charakter ogólny dla wszystkich encji, można zobaczyć tę samą metodę we wszystkich wygenerowanych rozszerzeniach, należy ją określić.

Poniżej linii jest specyficzna YourEntity klasy sprowadzić metody żądania

let fetchRequest: NSFetchRequest<**YourEntity**> = **YourEntity**.fetchRequest() 
Powiązane problemy