swift class generics protocols anyobject

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