SwiftUI 和 Combined 是什么 已发布 和 绑定 之间的区别



我知道在哪些情况下使用@Binding@Published

就像在ObservableObject中一样,我通常使用@PublishedobjectWillChange.send()

并在子视图中@Binding以将更改传播到父级

但是在这里,我有一些似乎同时使用@Binding@Published的片段 在可观察对象

我考虑有什么区别。

@Binding var input: T
@Binding var validation: Validation
@Published var value: T {
didSet {
self.input = self.value
self.validateField()
}
}
init(input: Binding<T>, rules: [Rule<T>], validation: Binding<Validation>) {
self._input = input
self.value = input.wrappedValue
self.rules = rules
self._validation = validation
}

正如我测试的那样,似乎如果我将 TextField 绑定到@Published那么 didSet 就会被调用,但如果我将其绑定到@Binding那么 didSet 就不会被调用。

对于@Binding,我发现如果您直接分配给属性,则会调用didSet。尝试在 xcode 操场中运行此示例:

import SwiftUI
import Combine
struct MyView: View {
@Binding var value: Int {
didSet {
print("didSet", value)
}
}
var body: some View { Text("Hello") }
}
var myBinding = Binding<Int>(
get: { 4 },
set: { v in print("set", v)})
let view = MyView(value: myBinding)
view.value = 99

输出:

set 99
didSet 4

关于@Published@Binding的区别:

  • 通常,您将使用@Binding将源自某个事实来源(如@State(的绑定传递到视图层次结构中。
  • ObservableObject中使用@Published以允许视图对属性的更改做出反应。

最新更新