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

Binding SwiftUI和Combine发布和绑定的区别是什么,binding,swiftui,combine,Binding,Swiftui,Combine,我知道在什么情况下使用@Binding和@Published 像在observeObject中一样,我通常使用@Published,或者objectWillChange.send() 和子视图中的@Binding,以将更改传播到父视图 但我这里有一个代码片段,它似乎同时使用了@绑定和@发布 在可观察对象中 我认为有什么区别。 @Binding var input: T @Binding var validation: Validation @Published var value: T {

我知道在什么情况下使用
@Binding
@Published

像在observeObject中一样,我通常使用@Published,或者
objectWillChange.send()

和子视图中的
@Binding
,以将更改传播到父视图

但我这里有一个代码片段,它似乎同时使用了
@绑定
@发布
可观察对象中

我认为有什么区别。

@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
}
@绑定变量输入:T
@绑定var验证:验证
@已发布的var值:T{
迪塞特{
self.input=self.value
self.validateField()
}
}
初始化(输入:绑定,规则:[规则],验证:绑定){
self.\u输入=输入
self.value=input.wrappedValue
self.rules=规则
自我验证=验证
}

当我测试时,似乎如果我将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
关于
@Published
@Binding
之间的区别:

  • 您通常会使用
    @Binding
    将源自某个真实来源(如
    @State
    )的绑定向下传递到视图层次结构
  • 可观察对象中使用
    @Published
    ,以允许视图对属性的更改作出反应

一个简单的区别是@publish为
向下的
或儿童工作,而@binding为
向上的
/父母工作。在某些情况下,您可以将两者结合在一起,但并非总是必要的
set 99
didSet 4