generics - type - protocol generic swift
Tipo genérico conforme a un protocolo en Swift. (3)
¿Es posible exigir que las instancias específicas de tipos genéricos se ajusten a un protocolo en Swift?
Por ejemplo, digamos que tengo un tipo genérico llamado Thing<T>
. Quiero que Thing<Int>
ajuste a un determinado protocolo, pero no a Thing<T>
.
Bueno, puede que no sea demasiado oneroso, y puede que sea lo suficientemente obvio como para que lo hayas ignorado, pero podrías hacer una "ejemplificación específica de un tipo genérico", como:
class ThingOfInt : Thing<Int>, SpecialIntProtocol {
// implement SpecialIntProtocol (if it isn''t already
// implemented in an extension)
}
O con un poco más de generalidad:
class IntThing<T:IntegerType> : MyThing<T>, SpecialIntProtocol {
}
En Swift 2.0 puedes ampliar protocolos y tipos.
Cuando lo extiendes puedes agregar un genérico where
restricciones. Solo los tipos que coincidan con esa regla podrán usar esa funcionalidad
Ejemplo :
public struct Thing<T> {
let x: T
}
extension Thing where T : IntegerType {
func giveMeInt () -> T {
return x
}
}
let a = Thing<Int>(x: 10)
a.giveMeInt()
let b = Thing(x: 10.1)
//b.giveMeInt() // Error
De esta manera puede agregar una funcionalidad adicional al tipo Thing<Int>
No conozco una forma de ajustarme a un protocolo en la extensión, pero no tiene mucho sentido.
Limitación: genérico where T :
se puede usar con protocolos y clases, por eso no podemos especificar Int allí
Puede hacer algo como usar la palabra clave where
y pasar las condiciones posteriores. Vio esto en la sección Cláusulas de dónde https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Generics.html#//apple_ref/doc/uid/TP40014097-CH26-XID_275
class Thing<T : SomeProtocol where reflect(T).summary != "Int"> {
...
}