visual studio microsoft español descargar community ios swift generics

ios - studio - Swift: cómo devolver el tipo de clase de la función



visual studio installer (4)

Sé que es posible pasar el tipo de clase a una función en forma rápida:

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

Pero, ¿cómo podemos devolver el tipo de función? Escribiendo algo así como

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

da error del compilador "Int no es idéntico a T". Entonces, ¿es posible devolver el tipo desde una función rápida?

Editar
Alguna explicación Tengo clases que se usan para persistencia (estoy usando Realm) y tengo clases que actúan como envoltorios alrededor de estas clases. Todas las envolturas heredan de RealmClassWrapper que necesita saber qué clase de Realm realmente envuelve. Entonces digamos que tengo este modelo de reino:

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

y mi clase de cena de envoltorios se ve así:

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

y envoltorio real:

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


Funciona cuando modifico tu función de esta manera:

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


Puede devolver cualquier tipo que desee.

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

Si el tipo no está determinado por argumentos o si el resultado es constante, no es necesario introducir un tipo de T genérico.


Sí, esto es posible El problema aquí es que dices que tu función devuelve un tipo de T.type genérico, pero siempre devuelves el tipo Int.type . Como T no siempre es un Int, el compilador genera un error.


Puedes forzar el downcast (como!) Como abajo

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

Pero fuera del alcance de la función, debe indicar el tipo devuelto:

var t:Int.Type = getGeneric()