2015-03-22 13 views
22

Ich weiß es möglich ist, Klassentyp auf eine Funktion in schnellen passieren:Swift: wie Klasse Typ von Funktion zurückzukehren

func setGeneric<T>(type: T.Type){ } 
setGeneric(Int.self) 

Aber wie können wir Art von Funktion zurückgeben? Schreiben etwas wie

gibt Compiler Fehler "Int ist nicht identisch mit T". Ist es also möglich, den Typ von einer schnellen Funktion zurückzugeben?

Bearbeiten
Einige Erklärung. Ich habe Klassen, die für die Persistenz verwendet werden (ich verwende Realm) und ich habe Klassen, die als Wrapper um diese Klassen agieren. Alle Wrapper erben von RealmClassWrapper, die wissen müssen, welche Realm-Klasse sie tatsächlich umschließt. So können sagen, ich dieses Reich Modell haben:

class RealmTodo: RLMObject { 
    dynamic var title = "" 
} 

und meine Wrapper Abendessen Klasse sieht wie folgt aus:

class RealmClassWrapper { 
    private let backingModel: RLMObject 
    //... 
    func backingModelType<T>() -> T.Type{ fatalError("must be implemented") } 
} 

und Ist-Wrapper:

class Todo: RealmClassWrapper { 
    //some other properties 
    func backingModelType<T>() -> T.Type{ return RealmTodo.self } 
} 

Antwort

22

können Sie jede Art zurückkehren Sie wollen.

func getTypeOfInt() -> Int.Type { return Int.self } 
func getTypeOfBool() -> Bool.Type { return Bool.self } 

Wenn der Typ nicht von Argumenten bestimmt wird, oder wenn die Rückkehr konstant ist, gibt es keine Notwendigkeit, eine generische T Art einzuführen.

+1

Danke! Das hat mein Problem gelöst. –

+0

Ich bin gerade darüber gestolpert, als ich nach Protokollen suchte. Angenommen, Sie haben ein öffentliches Protokoll 'ImageRendering' und eine private' MyImageRenderer' Implementierung, können Sie 'func getRendererType() -> ImageRendering.Type {return MyImageRenderer.self}' erstellen und es wird funktionieren. – milch

0

Ja, das ist möglich. Das Problem hier ist, dass Sie sagen, dass Ihre Funktion einen generischen T.type zurückgibt, aber Sie immer Int.type zurückgeben. Da T nicht immer ein Int ist, löst der Compiler einen Fehler aus.

+0

Vielen Dank für Ihre Antwort! Aber mir ist immer noch nicht klar, wie ich den Int-Typ von einer Funktion zurückgeben könnte. –

7

Es funktioniert, wenn ich Ihre Funktion wie folgt ändern:

func getGeneric<T>(object: T) -> T.Type { 
    return T.self 
} 

getGeneric(0) // Swift.Int 
+0

Vielen Dank für Ihre Antwort! Ihr Beispiel untersucht jedoch das Objekt und gibt seinen Typ zurück, aber ich möchte eine Funktion erstellen, die keine Eingabeparameter hat und den angegebenen Typ zurückgibt (wie in meinem Beispiel). –

+2

Ich verstehe nicht, was Sie erreichen wollen. Sie wollen keine Params? Was soll die Funktion dann zurückgeben? Immer der gleiche Typ? – Rengers

+0

Ich habe meine Antwort aktualisiert, um einen Kontext für meine Frage bereitzustellen. –

2

Sie können die niedergeschlagenen zwingen (! As) wie unten

func getGeneric<T>() -> T.Type { 
    return Int.self as! T.Type 
} 

Aber aus dem Funktionsumfang, müssen Sie den zurückgegebenen Typ anzuzeigen:

var t:Int.Type = getGeneric() 
Verwandte Themen