【问题标题】:SwiftUI and Combine what is the difference between Published and BindingSwiftUI 和 Combine Published 和 Binding 有什么区别
【发布时间】:2020-03-30 20:28:51
【问题描述】:

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

就像在ObservableObject中我一般使用@Published,或者objectWillChange.send()

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

但在这里我有 sn-p,它似乎正在使用 @Binding@PublishedObservableObject

我考虑有什么区别。

@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。

【问题讨论】:

  • 一个简单的区别是@publish 适用于downward 或孩子,而@binding 适用于upwards/ 父母。您可以在某些情况下将两者结合在一起,但并非总是必要的

标签: binding swiftui combine


【解决方案1】:

对于@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 以允许视图对属性的更改做出反应。

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多