Untitled
struct ProfileView: View, Identifiable { var id: String { return name } let name: String var body: some View { return Text(name) } } final class ProfileViewModel: ObservableObject { @Published var filterText: String = "" @Published var elements: [ProfileView] = [] var filteredElements: [ProfileView] { return elements.filter { $0.name.contains(filterText) } } } struct List2: View { @ObservedObject var ugaBugaViewModel = ProfileViewModel() var body: some View { List { ForEach(ugaBugaViewModel.filteredElements, content: { element in return element }) } } } protocol Renderable { associatedtype Render: View func render() -> Render } struct RenderableProfile: Renderable, Identifiable { var id: String { return name } let name: String func render() -> some View { return Text(name) } } final class RenderableViewModel: ObservableObject { @Published var filterText: String = "" @Published var elements: [RenderableProfile] = [] var filteredElements: [RenderableProfile] { return elements.filter { $0.name.contains(filterText) } } } struct List3: View { @ObservedObject var ugaBugaViewModel = RenderableViewModel() var body: some View { List { ForEach(ugaBugaViewModel.filteredElements, content: { element in return element.render() }) } } }
Leave a Comment