将 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'

这显然表明来自发布者的映射为我提供了实际值,而不是其他发布者。 那我怎么才能完成这个任务呢?

该错误消息没有任何意义,真正的错误是 isEmailValidOptional,因此您需要对其使用可选链接才能调用 map.

emailColor = isEmailValid?
        .map { self.emailColor(isValid: [=10=]) }
        .eraseToAnyPublisher()