Swiftui 如何对ObserveObject类进行绑定计算属性更新?

Swiftui 如何对ObserveObject类进行绑定计算属性更新?,swiftui,Swiftui,我有这门课: class MyModel:ObservableObject { var selectedObjectIndex:Int { set {} get { let selectedResult = objects.filter({ $0 == selectedObject }) if selectedResult == 0 { return 0 } return objects.firstIndex(of: selected

我有这门课:

class MyModel:ObservableObject {
  
  var selectedObjectIndex:Int {
    set {}
    get {
      let selectedResult = objects.filter({ $0 == selectedObject })
      if selectedResult == 0 { return 0 }
      return objects.firstIndex(of: selectedResult.first!)!
    }
  }
}
selectedObjectIndex
通常是一个
@Published var selectedObjectIndex:Int
,但由于它是一个计算属性,因此无法在此处使用
@Published

因此,我被迫将其添加到模型中

func getselectedObjectIndexBinding() -> Binding<Int> { 
  let binding = Binding<Int>(
    get: { () -> Int in
      return self.selectedObjectIndex
    }) { (newValue) in
    self.selectedObjectIndex = newValue
  }
  return binding
}

选择器显示正确,但如果我在其上设置了一个新值,则模型
selectedObjectIndex
不会更新。

您可以尝试以下操作,每当绑定更新时,您的
selectedObjectIndex
可以在完成一些相关工作后触发
对象更改
通知。我已经创建了
selectedObjectIndex
作为
propertyObserver

struct CreditCardFront: View {
    
    @ObservedObject var myModel:MyModel
   
   
    var body: some View {
        
        Picker(selection: myModel.getselectedObjectIndexBinding(),
               label: Text("select")) {
            
            ForEach(1..<10) { value in
                Text("\(value)")
            }
        }
        Text("\(myModel.selectedObjectIndex ?? 0)")
        
    }
    
    
}

class MyModel:ObservableObject {
    
    var selectedObjectIndex:Int?{
        didSet{
            // Your work here
            update() // call notification on specific change
        }
    }
    
    func getselectedObjectIndexBinding() -> Binding<Int> {
        let binding = Binding<Int>(
            get: { () -> Int in
                return self.selectedObjectIndex ?? 0
            }) { (newValue) in
            self.selectedObjectIndex = newValue
        }
        return binding
    }
    
    func update(){
        self.objectWillChange.send()
    }
}

您为selectedObjectIndex设置的方法不起作用。如何解决这个问题?这取决于您希望在
selectedObjectIndex.set
上持久化(即存储)什么。从你的代码来看,意图并不明确-你能详细说明一下吗?为什么不干脆
@StateObject var model=MyModel()
?@pawello2222我们当然可以这样做,但我有一个旧的代码片段,我刚刚修改过。
struct CreditCardFront: View {
    
    @ObservedObject var myModel:MyModel
   
   
    var body: some View {
        
        Picker(selection: myModel.getselectedObjectIndexBinding(),
               label: Text("select")) {
            
            ForEach(1..<10) { value in
                Text("\(value)")
            }
        }
        Text("\(myModel.selectedObjectIndex ?? 0)")
        
    }
    
    
}

class MyModel:ObservableObject {
    
    var selectedObjectIndex:Int?{
        didSet{
            // Your work here
            update() // call notification on specific change
        }
    }
    
    func getselectedObjectIndexBinding() -> Binding<Int> {
        let binding = Binding<Int>(
            get: { () -> Int in
                return self.selectedObjectIndex ?? 0
            }) { (newValue) in
            self.selectedObjectIndex = newValue
        }
        return binding
    }
    
    func update(){
        self.objectWillChange.send()
    }
}
@main
struct WaveViewApp: App {
    @StateObject var model:MyModel
    init() {
        let model = MyModel()
        _model = StateObject(wrappedValue: model)
    }
    
    var body: some Scene {
        WindowGroup {
            CreditCardFront(myModel: model)
        }
    }
}