Skip to content

Instantly share code, notes, and snippets.

@moyerr
Created November 7, 2023 18:01
Show Gist options
  • Save moyerr/85995c4ee21184853703975985a26bce to your computer and use it in GitHub Desktop.
Save moyerr/85995c4ee21184853703975985a26bce to your computer and use it in GitHub Desktop.
Apply a modifier to a view repeatedly with a recursive modifier
import SwiftUI
struct RecursiveModifier<Data: Collection, Transformed: View>: ViewModifier {
let data: Data
let transform: (Data.Element, AnyView) -> Transformed
func body(content: Content) -> some View {
var subsequence = data[...]
if let first = subsequence.popFirst() {
transform(first, AnyView(content))
.forEach(subsequence, transform: transform)
} else {
content
}
}
}
extension View {
func forEach<Data: Collection, Transformed: View>(
_ data: Data,
@ViewBuilder transform: @escaping (Data.Element, AnyView) -> Transformed
) -> some View {
modifier(RecursiveModifier(data: data, transform: transform))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment