SwiftUI和Combine的发布和绑定有什么区别

时间:2019-12-05 20:52:12

标签: binding swiftui combine

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

就像 ObservableObject 中一样,我通常使用 @Published objectWillChange.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 } 的代码段 在 ObservableObject

我考虑有什么区别。

{{1}}

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

1 个答案:

答案 0 :(得分:0)

对于@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)的绑定。
  • @Published中使用ObservableObject,以允许视图对属性更改做出反应。