Swift 如何使用publisher.CombineTest获取1个发布服务器

Swift 如何使用publisher.CombineTest获取1个发布服务器,swift,combine,Swift,Combine,我尝试使用2个发布服务器,并将它们流式传输到1个发布服务器,该发布服务器从这两个值映射而来 我的代码是: class ViewModel { let email = CurrentValueSubject<String, Never>("") lazy var isEmailValid = email.map { self.validateEmail(email: $0) } let password = CurrentValueSu

我尝试使用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 } 

    }
}
然后在init中我得到了这个错误:

    //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>'
我是新来组合的,所以我觉得有点困惑。 我应该如何从上面的代码将两个发布服务器isEmailValid和isPasswordCorrect组合成一个作为CurrentValueSubject的发布服务器?

a是:

包装单个值并在值更改时发布新元素的主题

您的canLogin肯定不是CurrentValueSubject。它是将其他两个发布服务器与CombineTest操作符组合,然后将组合的发布服务器映射到另一个发布服务器的结果

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

Publishers.Map<Publishers.CombineLatest<Publishers.Map<CurrentValueSubject<String, Never>, Bool>, Publishers.Map<CurrentValueSubject<String, Never>, Bool>>, Bool>
A是:

包装单个值并在值更改时发布新元素的主题

您的canLogin肯定不是CurrentValueSubject。它是将其他两个发布服务器与CombineTest操作符组合,然后将组合的发布服务器映射到另一个发布服务器的结果

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

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

您已完全错误地声明了canLogin的类型

它必须是AnyPublisher,您只需在地图上调用AnyPublisher即可获得它


您已完全错误地声明了canLogin的类型

它必须是AnyPublisher,您只需在地图上调用AnyPublisher即可获得它

lazy var canLogin: AnyPublisher<Bool, Never> = isEmailValid.combineLatest(isPasswordCorrect).map { $0 && $1 }.eraseToAnyPublisher()