由于@Observable 的美妙之处,如何从一个值中获取发布者?

Rol*_*tte 11 observable swift combine

按照Foo2类示例,我曾经将我的对象作为ObservableObject,我可以设置一个@Published值并监听它们的更改,就像使用合并一样。

现在我正在使用示例@Observable中所示的宏Foo1,我无法创建类似管道的组合。

@Observable有没有一种方法可以像我在使用@Published对象中的宏值时使用的方式来监听宏值ObservableObject

@Observable class Foo1 {

  var isEnabled = false

  init() {
    isEnabled
      .map { $0 } // Error: Value of type 'Bool' has no member 'map'
  }
}

class Foo2: ObservableObject {

  @Published var isEnabled = false

  var cancellables = Set<AnyCancellable>()

  init() {
    $isEnabled
      .map { $0 } // Works like a charm
      .sink { print($0.description) }  
      .store(in: &cancellables)
  }
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*iro 5

这似乎是一个限制,Apple 似乎没有在任何地方提到这种模式,很可能是因为在大多数情况下,您应该使用onChange().

要解决此限制,您可以创建一个@Published使用CurrentValueSubject创建的发布者类似的发布者:

import Combine

@Observable class Foo1 {

  var isEnabled = false {
    didSet { isEnabled$.send(isEnabled) }
  }
  var isEnabled$ = CurrentValueSubject<Bool, Never>(false)

  var cancellables = Set<AnyCancellable>()

  init() {
    isEnabled$
      .map { $0 }
      .sink { print($0.description) }
      .store(in: &cancellables)
  }
}
Run Code Online (Sandbox Code Playgroud)