https://kotlinlang.org logo
Title
a

Arkadii Ivanov

05/09/2023, 8:29 PM
It appears that on iOS SwiftUI we can leverage property wrappers so that observing
Value
looks nicer. Details are in the thread.
We can define the following property wrapper:
@propertyWrapper struct StateValue<T : AnyObject>: DynamicProperty {
    @ObservedObject
    private var obj: ObservableValue<T>

    var wrappedValue: T { obj.value }

    init(_ value: Value<T>) {
        obj = ObservableValue(value)
    }
}
And then instead of writing like this:
struct CounterView: View {
    let counter: CounterComponent

    private var observableModel: ObservableValue<CounterComponentModel>
    private var model: CounterComponentModel { observableModel.value }

    init(_ counter: CounterComponent) {
        self.counter = counter
        observableModel = ObservableValue(counter.model)
    }

    var body: some View {
        ...
    }
}
We can write like this:
struct CounterView: View {
    let counter: CounterComponent

    @StateValue
    private var model: CounterComponentModel

    init(_ counter: CounterComponent) {
        self.counter = counter
        _model = StateValue(counter.model)
    }

    var body: some View {
        ...
    }
}
What do you think? Are there any corner cases I'm missing?
a

Adam Brown

05/09/2023, 11:52 PM
not at my computer right now, but on the surface this looks great!
a

Arkadii Ivanov

05/14/2023, 7:43 PM
Seems working! Will update samples soon.