Hacer que una matriz Swift se ajuste a un protocolo

Digamos que ciertos elementos pueden aparecer en un Feed , siempre que implementen las properties necesarias definidas por el protocolo Feedable . Digamos también que el object Photo es digno de la alimentación:

 extension Photo: Feedable { } 

¿Es posible decir que una Array de estas fotos también podría ser Feedable ?

 extension [Photo] : Feedable 

¿O siempre necesito algún tipo de object envoltorio, como un PhotoAlbum , para ajustarse a Feedable ?

Editar

Para volver a iterar, tenía curiosidad de saber si puedo hacer solo arreglos de objects de Photo que se pueden Feedable . No hacer Array de ningún tipo de contenido Feedable , sin crear una matriz de Feedable s Feedable (los cuales se ofrecen como soluciones a continuación si eso es lo que necesita).

En otras palabras, una solución (que dudo existe) me permitiría definir una variable de tipo Feedable con los siguientes resultados:

 var feedable: Feedable //photo is feedable, so this is fine feedable = Photo() //ok //arrays of photos are feedable let photo1 = Photo() let photo2 = Photo() feedable = [photo1, photo2] //arrays of other things are not feedable = ["no", "dice"] //nope //even if the contents of an array are themselves Feedable, that's not sufficient. Eg Video is Feedable, but Array of Videos is not. let video1 = Video() let video2 = Video() feeble = video1 //fine feedable = [video1, video2] //nope 

Tal vez esta esencia (que no comstack, por supuesto) muestra la intención más claramente.

Si hubiera una variedad de Photo y Video , ¿qué te gustaría ser?

1. Cada elemento realiza como lo que son.

 extension Array where Element : Feedable { func foo() { if Element.self == Photo.self { } else { } } } 

2. La matriz completa funciona como 'Video'.

 extension Array where Element : Photo { func foo() { } } 

Creo que esto no es posible en la actualidad. En mi proyecto tengo el mismo problema con un ModelProducer.

 protocol M: ModelType {} protocol ModelProducerType { associatedtype M: ModelType var model: M? { get } func produce() } struct Test: ModelType {} class TestProducer: ModelProducerType { var model: Test? func produce() { model = Test() } } 

Utilizo ModelType como un protocolo fantasma. El problema es que no puedo hacer un productor model que produzca múltiples ModelType s, por la misma razón que descubrió. La solución en este caso fue la siguiente:

 protocol M: ModelType {} protocol ModelProducerType { associatedtype M: ModelType var model: [M] { get } func produce() } struct Test: ModelType {} class TestProducer: ModelProducerType { var model: [Test] = [] func produce() { model = [Test()] } } 

Esto es más flexible desde el principio. Me deshago de la variable opcional y los productores de model único solo tienen un elemento en la matriz. Tal vez puedas usar un enfoque similar.

No probé en el patio de recreo, pero tal vez pueda hacer una matriz de elementos de alimentación:

 var myPhotosArray = [Feedable]() 

Entonces, todo lo que implementa el protocolo Feedable estaría permitido en el Array. Si solo desea una matriz de fotos, todavía puede subclasificar su object Foto para crear un object FeedablePhoto.

Prueba esto en el patio de recreo en lugar de downvoting sin siquiera probar. En serio 3 votos negativos sin ninguna razón y explicación …

 import UIKit protocol Tree: class { func grow() } class BigTree: Tree { internal func grow() { print("Big tree growing") } } class SmallTree: Tree { internal func grow() { print("Small tree growing") } } class Car { //not a tree } var manyTrees = [Tree]() manyTrees.append(BigTree()) manyTrees.append(SmallTree()) manyTrees.append(Car()) //This makes an error "Car doesn't conform to expected type 'Tree'"