Попытка реализовать пользовательскую оболочку свойства, которая также публикует 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
.
Любая помощь будет оценена.