Swift 如何使用publisher.CombineTest获取1个发布服务器
我尝试使用2个发布服务器,并将它们流式传输到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
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()