【问题标题】:Map an AnyPublisher to another AnyPublisher将 AnyPublisher 映射到另一个 AnyPublisher
【发布时间】:2020-12-03 11:07:22
【问题描述】:

我有这个代码:

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()
    }
}

在 setupPublishers 函数中,我将 isEmailValid 创建为来自 CurrentValueSubject 'email' 的映射。 我希望直接从“isEmailValid”映射它,但如果我这样做:

        emailColor = isEmailValid
        .map { self.emailColor(isValid: $0) }
        .eraseToAnyPublisher()

我收到此错误:

Cannot convert value of type 'AnyPublisher<Bool, Never>' to expected argument type 'Bool'
Value of type 'UIColor?' has no member 'eraseToAnyPublisher'

这显然表明来自发布者的映射给了我实际价值,而不是另一个发布者。 那么我该如何完成这个任务呢?

【问题讨论】:

    标签: swift combine


    【解决方案1】:

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

    emailColor = isEmailValid?
            .map { self.emailColor(isValid: $0) }
            .eraseToAnyPublisher()
    

    【讨论】:

    • 谢谢,有趣的是,编译器并没有让我注意到这一点。结果证明这是一个非常基本的错误:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    相关资源
    最近更新 更多