Hay muy poca orientación actualizada sobre cómo hacer generadores en Swift (o iteradores , como aparentemente se les llama en Swift), especialmente si es nuevo en el idioma. ¿Por qué hay tantos tipos de generadores como AnyIterator
y UnfoldSequence
? ¿Por qué no funciona el siguiente código, que debería generarse a partir de una secuencia de Int
s individuales o matrices de Int
s?
Según tengo entendido, AnyIterator
se supone que debe tomar el cierre en el {}
s y convertirlo en el .next()
método en el generador devuelto, pero parece que no funciona. O debería usar UnfoldSequence
like en esta pregunta en su lugar. Estoy muy confundido.
,
Sí, el next()
método de AnyIterator
llama al cierre dado.
Y en su código, ese cierre devuelve el mismo primer elemento en cada llamada, porque no recuerda qué elementos ya se han devuelto.
Si Swift tuviera una yield
declaración como Python o C#, entonces las cosas serían más fáciles: podría yield segment
o yield i
y ya está.
¿Pero desafortunadamente? – Swift no tiene yield
declaración, lo que significa
que el cierre debe administrar explícitamente algún estado para reanudar la iteración
con el siguiente elemento en cada llamada.
Una posibilidad sería mantener dos índices, uno para
el segmento actual y otro para el elemento actual dentro de
un segmento si es una matriz:
Esto se puede generalizar a matrices arbitrariamente anidadas:
Las matrices que aún deben procesarse están en la pila junto con
su índice actual. Las matrices en sí no se modifican,
por lo que la copia es barata.
Ejemplo:
Consulte también Implementación de un generador recursivo para una estructura de árbol simple en Swift para obtener más
enfoques para enumerar recursivamente una estructura similar a un árbol.
,
También puede consultar esta implementación personalizada de un iterador como se ve en https://codeutlity.org/a/67215766/5867877
0 Comentarios