Pass a published property as binding

2k Views Asked by At

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.

1

There are 1 best solutions below

1
On BEST ANSWER

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