我有 x 个符合协议的数据模型(结构),我想在我的 viewModel 中有一个代表其中一种类型的
@Pubished
属性,并访问每个属性以在 UI 中分配,为什么这种方法不可能?我得到编译器无法输入检查..
protocol HumanProtocol {
associatedtype Human
}
struct Female: HumanProtocol {
typealias Human = Female
var name:String
}
struct Male: HumanProtocol {
typealias Human = Male
var name:String
}
class HumanViewModel:ObservableObject {
@Published var selectedHuman: Any HumanProtocol?
init(selectedHuman:Any HumanProtocol) {
self.selectedHuman = selectedHuman
}
}
想要的结果:
@StateObject var humanVM = HumanViewModel(selectedHuman:Male(name:""))
TextField("Nickname", text: $humanVM.selectedHuman.name )
.modifier(TextFieldModifier(width: 250, height: 30))
.padding(.top))
在这种情况下,使用泛型比尝试使用更好
any
:
class HumanViewModel<T: HumanProtocol>: ObservableObject {
@Published var selectedHuman: T
init(selectedHuman: T) {
self.selectedHuman = selectedHuman
}
}
struct Example: View {
@StateObject private var vm = HumanViewModel(selectedHuman: Male(name: "Test"))
var body: some View {
TextField("", text: $vm.selectedHuman.name)
}
}
在这里,可以推断
HumanViewModel
的类型,因为Male
被传递给它。