@已发布的var项目:有吗?浇注到混凝土类型并保持结合



读者注意:这是我犯的一个愚蠢的错误。。。我在子视图中使用@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)
}   
}
}

最新更新