Swift: propiedad de matriz con elementos que se ajustan a una class y múltiples protocolos simultáneamente

En Objective-C hay una manera de declarar una variable conforme a una class y un set de protocolos como este:

BaseClass<Protocol1, Protocol2> *variable = ... 

En Swift, me gustaría declarar una matriz (en realidad como una propiedad de una class) con elementos de un tipo definido por este patrón.

En esta pregunta hay una solución para describir el tipo de propiedad independiente haciendo que la class sea genérica y restringiendo el tipo en consecuencia. Para instanciar tal class, sería necesario especificar el tipo exacto. Esto no es un problema para una propiedad independiente, pero en una matriz debería ser posible almacenar elementos con diferentes types exactos.

¿Hay alguna forma de express esto en Swift?

Gracias a @SebastianDressler y @ Mike-S descubrí que no hay una forma directa de express esto en Swift.

Sin embargo, lo que puede hacer es limitar el tipo de elemento que desea agregar a la matriz de esta forma:

 func addItem<T where T: BaseClass, T: Protocol1, T: Protocol2>(item: T) { self.array.append(item) } 

Lanzar los elementos de la matriz cuando su tipo se define como uno de la class base de los protocolos no es posible, porque el comstackdor no ve ninguna relación entre esos types.

Para poder lanzar a la class base o a uno de los protocolos, es necesario declarar el tipo como AnyObject .

 var array: [AnyObject] = [] 

Y la conversión a los protocolos solo funciona cuando están anotados con @objc (consulte https://stackoverflow.com/a/24318145/670119 ).

En el caso de que desee almacenar solo objects que se ajusten a sus protocolos, puede hacer otro protocolo que henetworkinge a los demás, por ejemplo,

 protocol A { } protocol B { } protocol C : A, B { } 

Ahora puede crear la matriz correspondiente

 var objects : [ C ] 

Puede almacenar cualquier object, siempre que se ajuste al protocolo C y, por lo tanto, a A y B también:

 class Foo : X { } class Bar : X { } objects.append(Foo()) // [ Foo ] objects.append(Bar()) // [ Foo, Bar ] 

La técnica detrás es la inheritance de protocolo .

Actualice la OMI esto no es factible con la Array de Swift. Porque, puede almacenar un tipo henetworkingado de una class base o AnyObject , que no satisface sus restricciones. Pero posiblemente pueda crear un contenedor que compruebe el object que intenta agregar a su matriz y lo rechaza si no se ajusta a las restricciones.