used type parameter only not inferred has generic functions extension could constraint closure because associated swift generics

swift - type - Almacenar el tipo en la variable para usar como un tipo más tarde



generic var swift (3)

Estoy tratando de almacenar un tipo en una variable para poder usarlo como un tipo de primera clase más adelante.

class SomeModel {} let someType = SomeModel.self let array = Array<someType>()

En este caso, seguro que podría haber hecho Array<SomeModel>() lugar, pero quiero generalizarlo y dejar que las subclases proporcionen el valor de someType .

Sin embargo, recibo errores como el que someType isn''t a type o use of undeclared type ''someType'' en la última línea.


En estos días, esto se puede lograr de manera más fácil y adaptable utilizando .Type en una clase o protocolo. Tenga en cuenta que solo las funciones disponibles para esa clase raíz o protocolo serán accesibles, por lo que debe asegurarse de que se defina un inicializador requerido de algún tipo. Por ejemplo:

protocol MyClass { init(someValue: Int) } class MyWrapper { let myClassType: MyClass.Type init(classType: MyClass.Type) { self.myClassType = classType } func new(with value: Int) -> MyClassType { return MyClassType.init(someValue: value) } }

Ahora puede inicializar esta clase de fábrica bastante tonta con una clase específica implementando el protocolo MyClass y cuando llame a la new() función new() con un valor entero, generará una nueva instancia de esa clase y la devolverá.


Si necesita almacenar varios valores de tipo en una matriz, esto funciona bastante bien:

let array: [Any.Type] = [String.self, Int.self]


func someFunc<T>(model: T) -> Array<T> { let array = Array<T>() return array } let someType = SomeModel.self let array = someFunc(someType())

Parece que esto hace lo que quiero. El único inconveniente es que tengo que crear una instancia del tipo deseado para pasar. En este caso, su sobrecarga mínima, pero parece un desperdicio.

Otra cosa con el uso de genéricos como este es que parece que los posibles tipos genéricos se calculan en tiempo de compilación, por lo que en el tiempo de ejecución model.dynamicType no coincide necesariamente con T En la mayoría de los casos, lo hará, pero si está haciendo algo impulsado por la reflexión, asegúrese de verificar bien su caso de uso.