如何使用@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()
}
我想将 @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()
}