Массивы и коллекции / Итераторы

//a lazy generator walking backwards
func reverse<CBidirectionalCollection>(
    _ data: C) -> some Sequence<C.Element> {
    sequence(state: data.endIndex) {
        (i: inout C.Index) -> C.Elementin
        guard i > data.startIndex else {
            return nil
        }
        i = data.index(before: i)
        return data[i]
    }
}

for c in reverse("string") {
    print(c)
}
//printed g, n, i, r, t, s

for i in reverse([123]) {
    print(i)
}
//printed 3, 2, 1

//the built-in way to do the same
print(Array("string".reversed()))