En Swift, ¿cómo puedo declarar una variable de un tipo específico que se ajuste a uno o más protocolos?

En Swift puedo establecer explícitamente el tipo de una variable declarándola de la siguiente manera:

var object: TYPE_NAME

Si queremos ir un paso más allá y declarar una variable que se ajuste a múltiples protocolos, podemos usar elprotocol declarativo:

var object: protocol<ProtocolOne,ProtocolTwo>//etc

¿Qué sucede si quisiera declarar un objeto que se ajusta a uno o más protocolos y también es de un tipo de clase base específico? El equivalente de Objective-C se vería así:

NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;

En Swift esperaría que se vea así:

var object: TYPE_NAME,ProtocolOne//etc

Esto nos da la flexibilidad de poder lidiar con la implementación del tipo base, así como con la interfaz adicional definida en el protocolo.

¿Hay otra forma más obvia de que pueda estar perdiendo?

Ejemplo

Como ejemplo, digamos que tengo unUITableViewCell fábrica que se encarga de devolver las células que se ajustan a un protocolo. Podemos configurar fácilmente una función genérica que devuelve celdas conformes a un protocolo:

class CellFactory {
    class func createCellForItem<T: UITableViewCell where T:MyProtocol >(item: SpecialItem,tableView: UITableView) -> T {
        //etc
    }
}

más adelante quiero eliminar estas células mientras aprovecho tanto el tipo como el protocolo

var cell: MyProtocol = CellFactory.createCellForItem(somethingAtIndexPath) as UITableViewCell

Esto devuelve un error porque una celda de vista de tabla no se ajusta al protocolo ...

Me gustaría poder especificar que la celda es unUITableViewCell y se ajusta a laMyProtocol en la declaración de variable?

Justificación

Si está familiarizado con elPatrón de fábrica esto tendría sentido en el contexto de poder devolver objetos de una clase en particular que implementan una determinada interfaz.

Al igual que en mi ejemplo, a veces nos gusta definir interfaces que tengan sentido cuando se aplican a un objeto en particular. Mi ejemplo de la celda de vista de tabla es una de esas justificaciones.

Si bien el tipo suministrado no se ajusta exactamente a la interfaz mencionada, el objeto que devuelve la fábrica sí lo hace, por lo que me gustaría la flexibilidad para interactuar tanto con el tipo de clase base como con la interfaz de protocolo declarada

Respuestas a la pregunta(5)

Su respuesta a la pregunta