我正在寻找一种具有View和多态性的解决方案。我是一个带有特殊ViewModel的协议像这样:
protocol PQuestionView: View {
associatedtype VM where VM : BaseQuestionViewModel
var vm: Self.VM { get }
}
所以我可以在这样的结构中使用它:
struct test: PQuestionView {
var vm:YesNoQuestionViewModel = YesNoQuestionViewModel(question: Question(), temporaryId: 3)
var body: some View{
VStack{
Text("Yes")
}
}
}
我想拥有一个PQuestionView数组:
var questionViews: [PQuestionView]
但是我有两个关联的类型,看来实现视图的方法不能作为多态来工作。所以我尝试了类似的东西:
struct StrongView<MyView: View,VM: BaseQuestionViewModel> : PQuestionView{
var vm: VM
var body: MyView
}
但是它有一个强类型的结构,它不能解决我的通用性问题……对于这项工作是否存在一个好的解决方案?
这里是如何使用它的(由于缺少所有类型,我使用简单的存根复制了这些类型)。
经过测试并与Xcode 11.2 / iOS 13.2配合使用
[请注意,不允许在一个容器中放置不同的类型,因此,如果要执行此操作,则需要擦除类型,例如SwiftUI AnyView
对View
进行。
protocol BaseQuestionViewModel {
}
struct YesNoQuestionViewModel: BaseQuestionViewModel {
}
protocol PQuestionView: View {
associatedtype VM where VM : BaseQuestionViewModel
var vm: Self.VM { get }
}
struct test: PQuestionView {
var vm = YesNoQuestionViewModel()
var body: some View{
VStack{
Text("Yes")
}
}
}
struct QuestionsHolder<T: PQuestionView>: View {
var questionViews: [T]
var body: some View {
ForEach(0..<questionViews.count) { i in
self.questionViews[i]
}
}
}
struct TestViewGenerics_Previews: PreviewProvider {
static var previews: some View {
List {
QuestionsHolder(questionViews: [test(), test(), test()])
}
}
}