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()