读者注意:这是我犯的一个愚蠢的错误。。。我在子视图中使用@Binding
,而我本应该使用@ObservedObject
。这让我觉得我需要选Binding<ConcreteModel>
。。
我有一个已发布的类型为Any?
的var,我想强制转换它,并将它传递给View
,期望Binding<ConcreteModel>
。。。是否支持此功能?
我的选角有问题吗?
// This cast doesn't seem to be working...
if let concreteModel = viewModel.item as? Binding<ConcreteModel> {}
我在这方面没有成功:
class ConcreteModel {
public var count = 0
}
class MyViewModel: ObservableObject {
@Published var item: Any?
init() { item = ConcreteModel() }
}
// SwiftUI
struct MyView: View {
@ObservedObject var viewModel = MyViewModel()
var body: some View {
// This cast doesn't seem to be working...
if let concreteModel = viewModel.item as? Binding<ConcreteModel> {
MySecondView(concreteModel: concreteModel)
}
}
}
struct MySecondView: View {
@Binding var concreteModel: ConcreteModel
var body: some View {
Text("(concreteModel.count)")
}
}
使用泛型怎么样?例如
protocol Initializable {
init()
}
class ConcreteModel: Initializable {
public var count = 0
required init() {}
}
class MyViewModel<T>: ObservableObject where T: Initializable {
@Published var item: T?
init() { item = T() }
}
struct MyView: View {
@ObservedObject public var viewModel = MyViewModel<ConcreteModel>()
var body: some View {
MySecondView(concreteModel: $viewModel.item)
}
}
struct MySecondView: View {
@Binding var concreteModel: ConcreteModel?
var body: some View {
if let concreteModel = concreteModel {
Text("(concreteModel.count)")
}
}
}
好的,这里是一个解决方案:
// SwiftUI
struct MyView: View {
@ObservedObject var viewModel = MyViewModel()
var body: some View {
// get concrete type
if var concreteModel = viewModel.item as? ConcreteModel {
// create new binding
let binding = Binding<ConcreteModel>(get: {
concreteModel
}, set: {
concreteModel = $0
})
// pass through new binding
MySecondView(concreteModel: binding)
}
}
}