Как реализовать пользовательскую оболочку свойств, которая опубликовала бы sh изменений для SwiftUI для повторной визуализации его представления - PullRequest
0 голосов
/ 25 января 2020

Попытка реализовать пользовательскую оболочку свойства, которая также публикует sh свои изменения так же, как @Publish. Например, разрешить моему SwiftUI получать изменения в моем свойстве с помощью моей пользовательской оболочки.

Рабочий код, который у меня есть:

import SwiftUI

@propertyWrapper
struct MyWrapper<Value> {
    var value: Value

    init(wrappedValue: Value) { value = wrappedValue }

    var wrappedValue: Value {
        get { value }
        set { value = newValue }
    }
}

class MySettings: ObservableObject {
    @MyWrapper
    public var interval: Double = 50 {
        willSet { objectWillChange.send() }
    }
}

struct MyView: View {
    @EnvironmentObject var settings: MySettings

    var body: some View {
        VStack() {
            Text("\(settings.interval, specifier: "%.0f")").font(.title)
            Slider(value: $settings.interval, in: 0...100, step: 10)
        }
    }
}

struct MyView_Previews: PreviewProvider {
    static var previews: some View {
        MyView().environmentObject(MySettings())
    }
}

Однако мне не нравится необходимость вызова objectWillChange.send() для каждое свойство в MySettings классе.

Оболочка @Published работает хорошо, поэтому я попытался реализовать ее как часть @MyWrapper, но мне это не удалось.

Хорошее вдохновение Я нашел https://github.com/broadwaylamb/OpenCombine, но у меня не получилось даже при попытке использовать код оттуда.

Когда я боролся с реализацией, я понял, что для того, чтобы @MyWrapper работал, я необходимо точно понимать, как @EnvironmentObject и @ObservedObject подписываются на изменения @Published.

Любая помощь будет оценена.

...