【发布时间】:2020-01-25 18:54:12
【问题描述】:
尝试实现一个自定义属性包装器,它也会像@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())
}
}
但是,我不喜欢为 MySettings 类中的每个属性调用 objectWillChange.send()。
@Published 包装器运行良好,因此我尝试将其作为@MyWrapper 的一部分来实现,但没有成功。
我发现的一个很好的灵感是https://github.com/broadwaylamb/OpenCombine,但即使尝试使用那里的代码我也失败了。
在为实施而苦苦挣扎时,
我意识到,为了让@MyWrapper 正常工作,我需要准确了解@EnvironmentObject 和@ObservedObject 如何订阅@Published 的更改。
任何帮助将不胜感激。
【问题讨论】:
-
谢谢!然而,这种方法似乎不适用于
ObservableObject类:(
标签: swift swiftui property-wrapper