在 Combine 中合并两个 AnyPublisher

Combine two AnyPublisher in Combine

我有两个用户名测试,我想要两个,这样我就可以有不同的消息来确定用户名的长度,一个测试用户名的有效性。

到目前为止还不错,但我想将它们结合起来以确保我可以启用我的注册 UIButton

@Published var username: String = ""

var validLengthUsername: AnyPublisher<Bool, Never> {
    return $username.debounce(for: 0.2, scheduler: RunLoop.main)
        .removeDuplicates()
        .map{[=10=].count > 6 ? true : false}
        .eraseToAnyPublisher()
}

var formattedUserName: AnyPublisher<Bool, Never> {
    return $username
        .removeDuplicates()
        .map{[=10=].isValidEmail() ? true : false}
        .eraseToAnyPublisher()
}

我正在尝试映射它们 - 但是这给了我一个 AnyPublisher 数组。这不是我想要的 - 我想结合 validLengthUsername && formattedUserName - 我试过了但我不能简单地将两个 AnyPublisher.

您可以使用 zip 创建一个 Publisher,一旦两个发布者都发出一个新值,它就会发出一个值,并对压缩发布者的元素使用 AND 运算符。

var fullValidation: AnyPublisher<Bool, Never> {
    validLengthUsername
        .zip(formattedUserName)
        .map { [=10=] &&  }
        .eraseToAnyPublisher()
}