Context
I have a Protocol
and would like it to have a SwiftUI
some View
Type
as one of its Requirements
. I do know, that it is probably not the most elegant solution to mix the Model
with the View
, however, switching through all the different conforming Types
each time I want to use the View
isn't beautiful either.
Even though, I ran into a problem while implementing and got the following Compiler Error
:
'some' type cannot be the return type of a protocol requirement; did you mean to add an associated type?
Code
protocol Component {
var row: some View { get } // -> Compiler Error thrown in this Line.
}
// There are actually many more Types conforming to Component.
enum ComponentA: Component {
var row: some View {
Text("Component A")
}
}
struct ComponentsView: View {
var body: some View {
ForEach(components) { component in
component.row
}
}
}
Question
How can I achieve my goal of only having to define the selection of the appropriate SwiftUI View once?
CodePudding user response:
You could follow the same technique that Apple uses for View
itself, which you can see by Command-clicking on a View
reference in Xcode and selecting Jump to Definition.
protocol Component {
associatedtype Body: View
var row: Body { get }
As you declare some object's conformance to Component
, the row
autocomplete will automatically fill to some View
: