2015-03-22 31 views
22

wiem, że to jest możliwe, aby przejść typu klasy do funkcji w Swift:Swift: jak powrócić typ klasy z funkcją

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

Ale jak możemy wrócić typ z funkcji? Napisanie czegoś takiego jak daje błąd kompilatora "Int nie jest identyczny z T". Czy można zwrócić typ z funkcji Swift?

Edytuj
Niektóre wyjaśnienia. Mam klasy używane do utrzymywania (używam dziedziny) i mam klasy, które działają jak opakowania wokół tych klas. Wszystkie owijki dziedziczą po RealmClassWrapper, co wymaga znajomości klasy Realm, którą faktycznie otacza. Więc powiedzmy, że mam ten model erę:

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

i moja klasa owijarki kolacja wygląda następująco:

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

i rzeczywistej Wrapper:

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

Odpowiedz

22

Możesz powrócić dowolny typ chcesz.

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

Jeśli typ nie określa się z argumentami czy powrót jest stała, nie ma potrzeby, aby przedstawić ogólny T typu.

+1

Dziękujemy! To faktycznie rozwiązało mój problem. –

+0

Po prostu natknąłem się na to, gdy szukałem tego, jak to zrobić z protokołami. Załóżmy, że masz publiczny protokół 'ImageRendering' i prywatną implementację' MyImageRenderer', możesz zrobić 'func getRendererType() -> ImageRendering.Type {return MyImageRenderer.self}' i to zadziała. – milch

0

Tak, jest to możliwe. Problem polega na tym, że mówisz, że twoja funkcja zwraca ogólną wartość T.type, ale zawsze zwracasz Int.type. Ponieważ T nie zawsze jest int, kompilator podnosi błąd.

+0

dziękuję za odpowiedź! Ale nadal nie jest dla mnie jasne, w jaki sposób mogę zwrócić typ Int z funkcji –

7

Działa kiedy modyfikować swoją funkcję tak:

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

getGeneric(0) // Swift.Int 
+0

Dziękuję za odpowiedź! Jednak twój przykład bada obiekt i zwraca jego typ, ale chcę utworzyć funkcję, która nie ma parametrów wejściowych i zwraca określony typ (jak w moim przykładzie). –

+2

Nie rozumiem, co próbujesz osiągnąć. Nie chcesz żadnych params? Co chcesz, aby funkcja powróciła? Zawsze ten sam typ? – Rengers

+0

Zaktualizowałem swoją odpowiedź, aby zapewnić kontekst dla mojego pytania. –

2

Można wymusić spuszczonymi (! As), jak poniżej

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

Ale poza zakresem funkcji, trzeba wskazać zwracany typ:

var t:Int.Type = getGeneric() 
Powiązane problemy