SwiftUI viewModel,内部包含[任何协议]数组

问题描述 投票:0回答:1

我正在尝试实现 viewModel,它包含一个带有可观察对象的数组,并且所有内容都由接口覆盖。我怎样才能实现这个目标?我的代码现在出现错误

类型“任何 IItemViewModel”不能符合“IItemViewModel”

protocol IItemViewModel: ObservableObject {
    var title: String { get }
}

final class ItemViewModel: IItemViewModel, ObservableObject {
    let title: String
    
    init(title: String) {
        self.title = title
    }
}

protocol IMainViewModel: ObservableObject {
    var list: [any IItemViewModel] { get }
}

final class MainViewModel: IMainViewModel {
    @Published var list = [any IItemViewModel]()
    
    required init() {
        list.append(ItemViewModel(title: "test1"))
    }
}

struct MainView<ViewModel>: View where ViewModel: MainViewModel  {
    @ObservedObject var viewModel: ViewModel
    var items = [any IItemViewModel]()
    var body: some View {
        ScrollView(.vertical, showsIndicators: false) {
            LazyVStack(spacing: 0) {
                ForEach(viewModel.list, id: \.title) { model in
                    ItemView(viewModel: model) // <-- ERROR HERE
                }
            }
        }
    }
}

struct ItemView<ViewModel>: View where ViewModel: IItemViewModel {
    @ObservedObject var viewModel: ViewModel
    
    init(viewModel: ViewModel) {
        self.viewModel = viewModel
    }
    
    var body: some View {
        Text(viewModel.title)
    }
}
arrays swiftui view observable protocols
1个回答
0
投票

最好为您的视图模型使用

View
协议,例如只读:

struct MainView: View  {
    let items: [Item]

    var body: some View {

或用于读/写:

struct MainView: View  {
    @State var items: [Item] = []

    var body: some View {

struct MainView: View  {
    @Binding var items: [Item]

    var body: some View {
© www.soinside.com 2019 - 2024. All rights reserved.