我在Swift和SwiftUI上还很陌生,并且遇到了我无法理解的错误。
这是我通过Web服务使用JSON加载的类
class ResaListViewModel: ObservableObject {
@Published var resasDeparts = [ResaViewModel]()
init() {
WSResa().getDeparts { resas in
if let resas = resas as? [Resa] {
self.resasDeparts = resas.map(ResaViewModel.init)
}
}
}
}
class ResaViewModel: Identifiable, ObservableObject {
@Published var resa: Resa
init(resa: Resa) {
self.resa = resa
}
var id: Int {
return Int(self.resa.id)!
}
var nbveh: Int
{
return Int(self.resa.nbveh) ?? 0
}
}
在视图中,我想绑定nbveh属性,并使用按钮对其进行递增和递减。
错误是:“无法分配给属性:'nbveh'是仅获取属性”
struct ResaDetail: View {
@ObservedObject var resa:ResaViewModel
var body: some View {
vehiculeView(nbveh: $resa.nbveh)
}
struct ResaView: View {
let resaListVM = ResaListViewModel()
var body: some View {
List(self.resaListVM.resasDeparts, id: \.id) { resa in
NavigationLink(destination: ResaDetail(resa: resa)) {
ResaList(resa: resa)
}
}
} .navigationBarTitle(Text("Réservations"))
}
如何使该属性可编辑和可绑定?
感谢任何帮助
- Godefroy
答案 0 :(得分:0)
问题是您的nbveh
中的ResaViewModel
属性是computed property。 SwiftUI中的Binding
需要能够设置并获取值。由于计算属性的工作方式,您只能get
个,而不能set
个。
解决方案是将nbveh
更改为此:
var nbveh: Int {
get { return Int(resa.nbveh) ?? 0 }
set { resa.nbveh = newValue }
}
这告诉Swift在读取值时执行get { }
中的代码,并且在设置set { }
时将执行nbveh
。
这样,您就可以将其作为Binding
。
另一种解决方案可能是摆脱nbveh
中的ResaViewModel
变量,而只使用nbveh
中resa
的{{1}}属性。看起来像这样:
ResaViewModel
答案 1 :(得分:0)
更改后发送消息并重新加载UI的答案是:
get { return Int(resa.nbveh) ?? 0 }
set { resa.nbveh = String(newValue)
objectWillChange.send()
}
感谢您的帮助