将 AnyPublisher 映射到另一个 AnyPublisher
Map an AnyPublisher to another AnyPublisher
我有这个代码:
class ViewModel {
let email = CurrentValueSubject<String, Never>("")
private var isEmailValid: AnyPublisher<Bool, Never>?
var emailColor: AnyPublisher<UIColor, Never>?
private func validateEmail(email: String) -> Bool { return email == "1234@gmail.com" }
private func emailColor(isValid: Bool) -> UIColor { return isValid ? UIColor.black :
UIColor.red }
public func setupPublishers() {
isEmailValid = email
.map { self.validateEmail(email: [=10=]) }
.eraseToAnyPublisher()
emailColor = email
.map { self.emailColor(isValid: self.validateEmail(email: [=10=])) }
.eraseToAnyPublisher()
}
}
在函数 setupPublishers 中,我将 isEmailValid 创建为来自 CurrentValueSubject 'email' 的映射。
我希望直接从 'isEmailValid' 映射它,但如果我这样做:
emailColor = isEmailValid
.map { self.emailColor(isValid: [=11=]) }
.eraseToAnyPublisher()
我收到这个错误:
Cannot convert value of type 'AnyPublisher<Bool, Never>' to expected argument type 'Bool'
Value of type 'UIColor?' has no member 'eraseToAnyPublisher'
这显然表明来自发布者的映射为我提供了实际值,而不是其他发布者。
那我怎么才能完成这个任务呢?
该错误消息没有任何意义,真正的错误是 isEmailValid
是 Optional
,因此您需要对其使用可选链接才能调用 map
.
emailColor = isEmailValid?
.map { self.emailColor(isValid: [=10=]) }
.eraseToAnyPublisher()
我有这个代码:
class ViewModel {
let email = CurrentValueSubject<String, Never>("")
private var isEmailValid: AnyPublisher<Bool, Never>?
var emailColor: AnyPublisher<UIColor, Never>?
private func validateEmail(email: String) -> Bool { return email == "1234@gmail.com" }
private func emailColor(isValid: Bool) -> UIColor { return isValid ? UIColor.black :
UIColor.red }
public func setupPublishers() {
isEmailValid = email
.map { self.validateEmail(email: [=10=]) }
.eraseToAnyPublisher()
emailColor = email
.map { self.emailColor(isValid: self.validateEmail(email: [=10=])) }
.eraseToAnyPublisher()
}
}
在函数 setupPublishers 中,我将 isEmailValid 创建为来自 CurrentValueSubject 'email' 的映射。 我希望直接从 'isEmailValid' 映射它,但如果我这样做:
emailColor = isEmailValid
.map { self.emailColor(isValid: [=11=]) }
.eraseToAnyPublisher()
我收到这个错误:
Cannot convert value of type 'AnyPublisher<Bool, Never>' to expected argument type 'Bool'
Value of type 'UIColor?' has no member 'eraseToAnyPublisher'
这显然表明来自发布者的映射为我提供了实际值,而不是其他发布者。 那我怎么才能完成这个任务呢?
该错误消息没有任何意义,真正的错误是 isEmailValid
是 Optional
,因此您需要对其使用可选链接才能调用 map
.
emailColor = isEmailValid?
.map { self.emailColor(isValid: [=10=]) }
.eraseToAnyPublisher()