我正在尝试实现 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)
}
}
最好为您的视图模型使用
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 {