2016-09-14 5 views
13

nach den neuen Änderungen Core Data, erzeugt Xcode diese Unterklasse für mich:Subclass.fetchRequest() Swift 3.0, Erweiterung hilft nicht wirklich 100%?

extension Person { 

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

    @NSManaged public var name: String? 

} 

dann in Code, um diese eine Zeile Arbeits haben ich erwartet hatte:

let fr = Person.fetchRequest() 

Diese Codezeile oben jedoch gibt mir eine Fehlermeldung:

:

"Ambiguous use of 'fetchRequest' 

Dies behebt das Problem So

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

dann, ich bin verwirrt, was ist das:

NSFetchRequest<Person> 

in der:

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

Rückgabetyp überhaupt tun?

Sollte nicht der Rückgabetyp mir nicht erlauben, die angeben, zu haben:

NSFetchRequest<Person> 

in der let Definition ??

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

Kann jemand mir helfen zu verstehen, warum es benötigt wird, obwohl es bereits Teil des Rückgabetyps ist?

Antwort

8
holen

Der Grund, warum dies geschieht ist, gibt es zwei Methoden fetchRequest in Ihrer Person Klasse mit dem Namen:

  • erste ist in Ihrem Modellunterklasse (Person) mit Rückgabetyp NSFetchRequest<Person>
  • Sekunde ist in NSManagedObject mit Rückgabetyp NSFetchRequest<NSFetchRequestResult>

, die tatsächlich ist, warum es nicht eindeutig ist, Compiler nicht, was Sie sich beziehen von 2 nicht kennt. Wenn du den func-Namen in deinem Person+CoreDataProperties von fetchRequest zu personFetchRequest umbenennst und mit diesem Namen rufst - würde es einfach so kompilieren.

Noch besser - fügen Sie einfach einen anderen func zu Ihrem Person+CoreDataClass mit anderem Namen, der Person.fetchRequest() zurückgeben würde, und Sie müssen nicht umwandeln, wenn Sie mit diesem Namen anrufen.

3

Der Grund ist der generische Typ. NSFetchRequest wurde in ein generisches Format umgewandelt, um eine Menge von Typ Casting zu vermeiden.

Wenn die Funktion keinen Parameter akzeptiert, so dass der konkrete Typ (Person) nicht direkt übergeben werden kann und der Rückgabetyp ebenfalls generisch ist, muss er explizit kommentiert werden.

+2

ok, also wo ich stecken bleibt ist die Tatsache, dass Sie sagen, dass der Rückgabetyp auch ein generischer ist, aber es sagt NSFetchRequest und nicht NSFetchRequest , so scheint es wie Person bereits abgeleitete ist ... – zumzum

+0

I wrote: ** Wenn ** ... der Rückgabetyp ... generisch ist, muss er kommentiert werden. – vadian

9

Da fetchRequest() für alle Entitäten generisch ist, können Sie dieselbe Methode in allen Ihren generierten Erweiterungen sehen, Sie müssen sie spezifisch machen.

Unterhalb Linie ist spezifisch für YourEntity Klasse Anforderungsmethode

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