Restricciones genéricas de solo clase en Swift
class generics (1)
Estoy tratando de marcar una variable de un tipo genérico como débil:
class X<T> {
weak var t: T?
}
Si no pongo ninguna restricción para T
, el error weak cannot be applied to non-class type ''T''
.
Si solo usara esto con clases derivadas de NSObject esto funcionaría:
class X<T: NSObject> {
weak var t: T?
}
Pero también quiero poder usar clases Swift puras.
Para los protocolos es posible requerir que el implementador sea del tipo de clase utilizando la palabra clave de class
:
protocol ClassType: class {
}
Con el protocolo ClassType
ahora puedo marcar la variable como débil:
class X<T: ClassType> {
weak var t: T?
}
Pero no puedo agregar la palabra clave de class
directamente al parámetro genérico:
class X<T: class> { // Compile error
weak var t: T?
}
Puedo hacer que la solución de protocolo funcione para todas las clases derivadas de NSObject con una extensión:
extension NSObject: ClassType {
}
Pero para las clases Swift puras no hay una superclase común a la que podría agregar esta extensión. ¿Hay alguna manera de hacer que esto funcione sin agregar el protocolo ClassType
a cada clase con la que quiero usar la clase X
? Por ejemplo, algún calificador especial para el parámetro genérico como class X<T:ThisIsAClass>
?
Desea AnyObject
, que los documentos Swift describen como:
El protocolo al que todas las clases se conforman implícitamente.
class X<T: AnyObject> {
weak var t: T?
}
class C { }
let x = X<C>() // works fine
x.t = C()
// error: type ''Int'' does not conform to protocol ‘AnyObject’
// (because Int is a struct)
let y = X<Int>()