Función que acepta la secuencia de tipo

Quiero una function que acepte una secuencia de Int . Esto es lo que quiero escribir:

 func process(items: Sequence<Int>) { items.forEach { ... } } 

Error: "No se puede especializar el tipo no genérico 'Secuencia'".

Corregido (creo):

 func process<S: Sequence>(items: S) where S.Iterator.Element == Int { items.forEach { ... } } 

Bastante más detallado.

Sé que el protocolo de secuencia tiene un tipo asociado de Iterator que tiene Element . Pero no estoy muy seguro de por qué tengo que resolver el requisito de Int de una manera tan extraña.

¿Cuáles son los conceptos subyacentes que hacen que la primera versión no funcione, pero la segunda? ¿Qué significa el error?

Su pregunta es hacer con la diferencia entre los types generics y los types asociados . Vea aquí (secciones tituladas "Tipos generics", "Tipos asociados") para una explicación básica de sus propósitos en Swift. Los protocolos, como Secuencia, usan types asociados, en lugar de types generics. Su primera muestra de código tendría sentido si la Sequence fuera una class concreta con un tipo genérico: esta diferencia debería explicar el post de error.

En cuanto a por qué los protocolos usan types asociados, en lugar de los types generics, vea la respuesta superior a esta pregunta . Básicamente, aunque parecen servir para el mismo propósito, los types asociados son más flexibles y descriptivos, donde los types generics se refieren a la implementación. Esto hace que su código de muestra sea más detallado, pero en general, hace que muchas muestras de código sean más simples.

De hecho, desde el código fuente de la Secuencia , la Sequence tiene un Iterador de tipo asociado, que se ajusta al protocolo IteratorProtocol, que a su vez tiene su propio tipo de elemento asociado (que puede ser de cualquier tipo).

¿Por qué no estás usando una matriz de Int ?

 func process(items: [Int]) { items.forEach { ... } } 

Puede usar los parameters de Variadic :

 func process(items: Int...) { items.forEach { (item) in //do stuff with your 'item' } }