2016-05-18 13 views
0

Ich versuche, eine generische Funktion in einer Klassenerweiterung zu erstellen, aber ich erhalte einen Compilerfehler.Schnelle generische Funktion

Ich habe zu den Klassen A und B, die sich beide NSManagedObject

ich eine findOne() Funktion in meiner Klasse Erweiterung erstellen möchten.

extension NSManagedObject { 
    public class func findOne() -> NSManagedObject { 
    // some working stuff returning a NSManagedObject 
    } 
} 

Mein Problem ist: Wenn ich diese Methode auf A zu verwenden, ist der Rückgabetyp NSManagedObject

let aObject = A.findOne //type is NSManagedObject 

Also, natürlich kann ich es gegossen und ein A-Klasse-Objekt

let aObject = A.findOne as! A//type is NSManagedObject 
erhalten

Starten hier, ich möchte meine Erweiterung Implementierung ersetzen, um generische verwenden, so dass ich:

Ich versuchte dies:

extension NSManagedObject { 
    public class func findOne<T>() -> T { 
    // some working stuff returning a NSManagedObject 
    } 
} 

Aber A.findOne() ist noch NSManagedObject Typ.

Kann mir jemand helfen?

UPDATE der folgende Code tatsächlich funktioniert, wenn ich benutze:

class func findOne<T : NSManagedObject>() -> T { 
    //Do some stuff 
    return myObject as! T 
} 

let myObject : A = A.findOne() 
+0

möchten Sie vielleicht verwenden 'Self' als Rückgabetyp zu werfen. – luk2302

+0

Vergleichen [Wie kann ich Instanzen von verwalteten Objektunterklassen in einer NSManagedObject Swift-Erweiterung erstellen?] (Http://stackoverflow.com/questions/27109268/how-can-i-create-instances-of-managed-object-subclasses- in-a-nsmanagedObject-swi). –

+0

@Alessandro: Warum haben Sie "OS X" in den Titel und die Tags hinzugefügt? Core Data existiert auch auf iOS, und nichts in dieser Frage ist spezifisch für OS X. –

Antwort

0

Sie ein BaseModel erstellen können, die alle Ihre Modelle erben. Verwenden Sie die generischen Typparameter das Objekt entsprechend

class BaseModel : NSManagedObject { 

    class func find<T>(objectID: NSManagedObjectID) -> T 
    { 
     return someObjectContext.objectWithID(objectID) as! T 
    } 
} 

class Person : BaseModel { 

} 


let person: Person = Person.find(someObjectId) 

Generics

+0

Sowohl A als auch B erweitern 'NSManagedObject', sodass Ihre Antwort mein Problem nicht löst :( – CZ54

Verwandte Themen