如何使用@Published 和地图?

How do I use @Published and map?

我想将 @Published 属性 包装器与 map 结合使用,但出现此编译器错误:

Cannot convert return expression of type 'Publishers.Map<Published.Publisher, Bool>' to return type 'Published.Publisher'

@Published private var aNumber: Int = 1

var theNumberIsZero2: Published<Bool>.Publisher {
   $aNumber.map { number -> Bool in
      return number == 0
   }
}

我可以只使用 CurrentValueSubject,如下所示,但我失去了一些好处,因为无法同步检查 theNumberIsZero

private let currentValueNumber = CurrentValueSubject<Int, Never>(0)
    
var theNumberIsZero: AnyPublisher<Bool, Never> {
   currentValueNumber.map { number -> Bool in
      return number == 0
    }
    .eraseToAnyPublisher()
}
    

我该怎么做?

你可以这样解决:通过链接 value 和 isZero。每次值更新时 isZero 也会更新:

protocol ZeroChecking {

    var isZeroPublisher: Published<Bool>.Publisher { get }
}

class Number: ObservableObject, ZeroChecking {


    @Published var value: Int = 1
    @Published private(set) var isZero: Bool = false
    lazy var isZeroPublisher: Published<Bool>.Publisher = $isZero

    public init() {
        $value
            .map { [=10=] == 0 }
            .assign(to: &$isZero)
    }

}

您几乎可以定义一个计算 属性,它 returns 一个映射由 @Published 发出的值的发布者,但它不应该是 Published<Bool>.Publisher 类型 - 它应该只是 AnyPublisher<Bool, Never> 类型:

@Published private var aNumber: Int = 1

var theNumberIsZero2: AnyPublisher<Bool, Never> {
   $aNumber.map { [=10=] == 0 }
           .eraseToAnyPublisher()
}