swiftuibindingproperty-wrapper-published

Pass a published property as binding


I have an ObservableObject with a published dictionary of strings to arrays with arrays with Ints:

class MyObservableObject: ObservableObject {
    @Published var myDict: [String: [[Int]]]
}

And I want to pass one array of Ints as a Binding from inside the same class to a function of a different struct:

{
...
    func someFunc(key: String, index: Int) {
        someStruct.func(myDict[key]![index])
    }
...
}

I understand that @Published vars can't be passed as Bindings. I'm still hoping that there's any way to achieve this. I also tried storing a reference to the array in the other struct using an inout variable, also without success.


Solution

  • @Published vars can't be passed as Bindings

    It is not true - it is possible, via projected value using '$', but you want to pass not a property, but part of value of a property, and this is different thing.

    The context is not clear and this someFunc smells not-well :) - I'd say it is needed some refactoring here, but, anyway, technically it is possible to do what you want using dynamically in-place generated binding, like

    func someFunc(key: String, index: Int) {
        guard myDict[key] != nil else { return }
        someStruct.func(Binding<[Int]>(
                get: { self.myDict[key]![index] },
                set: { self.myDict[key]![index] = $0 }
        ))
    }