swift - 如何使用 Publishers.CombineLatest 获得 1 个发布者

标签 swift combine

我正在尝试使用 2 个发布者并让它们流式传输到从两个值映射的 1 个发布者。

我的代码是:

class ViewModel {

    let email = CurrentValueSubject<String, Never>("")

    lazy var isEmailValid = email.map { self.validateEmail(email: $0) }

    let password = CurrentValueSubject<String, Never>("")

    lazy var isPasswordCorrect = password.map {
        self.validatePassword(password: $0)
    }

    let canLogin: CurrentValueSubject<Bool, Never>

    private func validateEmail(email: String) -> Bool {
        return email == "1234@gmail.com"
    }

    private func validatePassword(password: String) -> Bool {
        return password == "1234"
    }


    init() {
    
        canLogin = Publishers
            .CombineLatest(isEmailValid, isPasswordCorrect)
            .map { $0 && $1 } 

    }
}

然后在初始化中我得到这个错误:

    //error: Cannot assign value of type 
'Publishers.Map<Publishers.CombineLatest<Publishers.Map<CurrentValueSubject<String, Never>, 
Bool>, Publishers.Map<CurrentValueSubject<String, Never>, Bool>>, Bool>' to type 'CurrentValueSubject<Bool, Never>'

我是新手,所以我觉得有点困惑。 我应该如何从上面的代码中将 2 个发布者 isEmailValid 和 isPasswordCorrect 组合成 1 个发布者,即 CurrentValueSubject

最佳答案

A CurrentValueSubject是:

A subject that wraps a single value and publishes a new element whenever the value changes.

您的 canLogin 肯定不是 CurrentValueSubject。它是使用 CombineLatest 运算符组合其他两个发布者,然后将组合的发布者映射到另一个发布者的结果。

在Swift类型系统的语言中,这种发布者被称为:

Publishers.Map<Publishers.CombineLatest<Publishers.Map<CurrentValueSubject<String, Never>, Bool>, Publishers.Map<CurrentValueSubject<String, Never>, Bool>>, Bool>

显然,没有人会声明一个类型为这种类型的属性,因此我们使用 eraseToAnyPublisher 为自己获取一个 AnyPublisher,表示我们实际上并不关心这是什么类型的发布商。

let canLogin: AnyPublisher<Bool, Never>

...

canLogin = Publishers
        .CombineLatest(isEmailValid, isPasswordCorrect)
        .map { $0 && $1 } 
        .eraseToAnyPublisher()

关于swift - 如何使用 Publishers.CombineLatest 获得 1 个发布者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65072163/

相关文章:

swift - 如何将单独的 xib 单元格注册到多个 TableView ?

Swift - 以编程方式创建 View 时的 Lazy Var 与 Let(节省内存)

ios - 如何创建同时缓存的发布属性包装器

swift - 为什么用户默认发布者多次触发

Swift 联合发布两次

ios - @Published 和 .assign 对值更新没有反应

ios - UITableView:按部分中的日期和行中的时间对事件进行排序

swift - PayPal SDK 请求访问 token 返回代码 401(未授权)

swift - 是什么 ??运算符(operator)?

swift - 如何使用 combine Publisher 更改线程?