Swift 将一个AnyPublisher映射到另一个AnyPublisher
我有以下代码:Swift 将一个AnyPublisher映射到另一个AnyPublisher,swift,combine,Swift,Combine,我有以下代码: class ViewModel { let email = CurrentValueSubject<String, Never>("") private var isEmailValid: AnyPublisher<Bool, Never>? var emailColor: AnyPublisher<UIColor, Never>? private func validateEmai
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: $0) }
.eraseToAnyPublisher()
emailColor = email
.map { self.emailColor(isValid: self.validateEmail(email: $0)) }
.eraseToAnyPublisher()
}
}
我得到这个错误:
Cannot convert value of type 'AnyPublisher<Bool, Never>' to expected argument type 'Bool'
Value of type 'UIColor?' has no member 'eraseToAnyPublisher'
无法将“AnyPublisher”类型的值转换为预期的参数类型“Bool”
“UIColor”类型的值没有成员“eraseToAnyPublisher”
这显然表明来自发布服务器的映射为我提供了实际值,而不是其他发布服务器。
那么我怎样才能完成这个任务呢?这个错误消息没有任何意义,真正的错误是
isEmailValid
是可选的
,所以你需要在它上面使用可选链接才能调用映射
emailColor = isEmailValid?
.map { self.emailColor(isValid: $0) }
.eraseToAnyPublisher()
谢谢,有趣的是,编译器没有让我注意到这一点。这是一个非常基本的错误:)
emailColor = isEmailValid?
.map { self.emailColor(isValid: $0) }
.eraseToAnyPublisher()