Xcode preview doesn't work with generic view

Viewed 249

I want to use generic subview in SwiftUI view.

struct UserChoiceView<DecisionView: View>: View {
    let subview: DecisionView
    var body: some View {
        subview
            .padding()
            .offset(x: 10)
    }
}

struct LikeDislikeView_Previews: PreviewProvider {
    static var previews: some View {
        UserChoiceView(subview: RoundedRectangle(cornerRadius: 10)
                                    .fill(Color.red.opacity(0.9)))
    }
}

Code above works fine, but Xcode can't generate preview. I receive this error:

reference to generic type 'UserChoiceView' requires arguments in <...>

I think I can solve this by using AnyView type erasure, but maybe there are other workarounds.

1 Answers

You need to explicitly define the view in the preview.

struct UserChoiceView<DecisionView: View>: View {
    let subview: DecisionView

    var body: some View {
        /// ...
    }
}

struct LikeDislikeView_Previews: PreviewProvider {
    static var decisionView: View {
        // return SomeDecisionView()
    }

    static var previews: some View {
        UserChoiceView<Self.decisionView>(subview: Self.decisionView)
    }
}
Related