Skip to content

Instantly share code, notes, and snippets.

@andreweades
Created October 16, 2022 16:39
Show Gist options
  • Save andreweades/57c95566e074f425508f8793f0530bab to your computer and use it in GitHub Desktop.
Save andreweades/57c95566e074f425508f8793f0530bab to your computer and use it in GitHub Desktop.
import SwiftUI
struct ViewProvider: Identifiable {
var id: AnyHashable
var type: Any
var view: AnyView
init<ViewType>(view: ViewType) where ViewType: View & Identifiable {
self.id = view.id
self.type = ViewType.self
self.view = AnyView(erasing: view)
}
func content() -> AnyView {
self.view
}
}
struct ViewProviders: Sequence, Collection, BidirectionalCollection, RandomAccessCollection {
struct Iterator: IteratorProtocol {
var it: Int
var endIndex: Int {
elements.endIndex
}
let elements: [ViewProvider]
init(elements: [ViewProvider]) {
self.it = elements.startIndex
self.elements = elements
}
mutating func next() -> ViewProvider? {
guard it != endIndex else { return nil }
defer { it += 1 }
return elements[it]
}
}
func makeIterator() -> Iterator {
Iterator(elements: viewProviders)
}
private var viewProviders: [ViewProvider] = []
var startIndex: Int {
viewProviders.startIndex
}
var endIndex: Int {
viewProviders.endIndex
}
func index(after i: Int) -> Int {
viewProviders.index(after: i)
}
func index(before i: Int) -> Int {
viewProviders.index(before: i)
}
subscript(position: Int) -> ViewProvider {
get {
viewProviders[position]
}
set {
viewProviders[position] = newValue
}
}
}
struct RootView: View {
var children: ViewProviders
var body: some View {
VStack {
ForEach(children) {child in
child.content()
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment