0

我是 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' 是一个 get-only 属性”

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"))
}

如何使此属性可编辑和可绑定?

感谢您的任何帮助

——戈德弗罗伊

4

2 回答 2

0

更改消息并重新加载 UI 时发送消息的答案是:

get { return Int(resa.nbveh) ?? 0 }
    set { resa.nbveh = String(newValue)
        objectWillChange.send()
    }

谢谢你的帮助

于 2020-08-25T23:24:34.010 回答
0

问题是nbveh您的属性ResaViewModel计算属性。SwiftUI 中的 ABinding需要能够设置和获取值。由于计算属性的工作方式,您只能使用get它们,而不能使用set它们。

解决方案是将其更改nbveh为:

var nbveh: Int {
    get { return Int(resa.nbveh) ?? 0 }
    set { resa.nbveh = newValue }
}

这告诉 Swift 在get { }你读取值时执行代码,并set { }在设置nbveh. 这样,您就可以将其作为Binding.

一个不同的解决方案可能是摆脱你的nbvehvarResaViewModel并简单地使用in的nbveh属性。这看起来像这样:resaResaViewModel

vehiculeView(nbveh: $resa.resa.nbveh)
于 2020-08-25T10:32:45.817 回答