swift - ¿Cómo obtener el conteo de un tipo conforme a ''Secuencia''?
count sequence (1)
Digamos que tengo este código:
func work<S: Sequence>(sequence: S) {
// do stuff
}
¿Cómo podría averiguar cuántos elementos hay en sequence
?
La versión obvia que elegiría es bastante ineficiente:
var count = 0
for element in sequence {
count += 1
}
Debe haber una manera más agradable, ¿verdad?
No creo que haya un método mejor para un tipo arbitrario que se ajuste a SequenceType
. Lo único que se sabe sobre una secuencia es que tiene un método generate()
que devuelve un GeneratorType
, que a su vez tiene un método next()
. El método next()
avanza al siguiente elemento de la secuencia y lo devuelve, o devuelve nil
si no hay próximo elemento.
Tenga en cuenta que no es necesario en absoluto que next()
eventualmente devuelva nil
: una secuencia puede tener elementos "infinitos".
Por lo tanto, enumerar la secuencia es el único método para contar sus elementos. Pero esto no necesita terminar. Por lo tanto, la respuesta también podría ser: una función que toma un argumento de secuencia no debería necesitar conocer la cantidad total de elementos.
Para tipos que se ajustan a CollectionType
puede usar la función countElements()
(renombrada a count()
en Swift 1.2).
También hay underestimateCount()
:
/// Return an underestimate of the number of elements in the given
/// sequence, without consuming the sequence. For Sequences that are
/// actually Collections, this will return countElements(x)
func underestimateCount<T : SequenceType>(x: T) -> Int
pero eso no necesariamente devuelve la cantidad exacta de elementos.