type generic functions associated class generics swift

class - generic - Limitación con clases derivadas de clases genéricas en swift



swift use generic (4)

¡Tuve el mismo problema y encontré una solución!

class SomeType { } class Foo<T> { } class Bar<T: SomeType>: Foo<T> { }

Ahora puedes hacer:

let bar = Bar()

Esto hará que el tipo de Bar predeterminado sea SomeType. El único inconveniente es que solo puede hacer esto para los tipos "subclasables". Entonces para Int esto no funcionará.

Estoy tratando de derivar mi clase de la clase genérica:

class foo<T> {} class bar : foo<Int> {}

Pero este código no se puede compilar con un error:

Las clases derivadas de clases genéricas también deben ser genéricas

¿Cómo evitar esta limitación? ¿Es posible?


En Swift 2 es posible crear una clase genérica de subclase:

class Something {} class Base<T> {} class Fancy : Base<Something> {}


Ssreg,

Desafortunadamente esto es official :

Puede subclasificar una clase genérica, pero la subclase también debe ser una clase genérica.

Esperemos que Apple solucione esto en una versión futura.

Mientras tanto, veamos esto como una oportunidad para explotar la aggregation lugar de crear subclases.

NOTA:

Como versión de una solución para un pobre, uno podría usar typealias :

class foo<T> {} class bar<Int> : foo<Int> {} typealias Bar = bar<Int>

De esta forma, el resto del código se puede escribir como si Apple ya hubiera solucionado el problema.


Una alternativa a la solution typealias es tomar la documentación literalmente:

Puede subclasificar una clase genérica, pero la subclase también debe ser una clase genérica.

Así que hacemos de la subclase una clase genérica, pero de otro tipo que no usamos para nada.

class foo<T> { func doSomething(t:T) -> T { return t; } } class bar<S> : foo<Int> { override func doSomething(t:Int) -> Int { return t * t; } } let b : bar = bar<AnyObject>() b.doSomething(5) // 25 instead of 5

Prefiero este enfoque para usar typealias porque no contamina el espacio de nombres con un tipo adicional. Esto es de particular importancia si la subclase ( bar ) está destinada a ser public o internal .

Editar

La documentación ya no incluye la frase sobre la limitación de subclases genéricas. Esperemos que esto signifique que Apple planea cambiar esto más temprano que tarde.