У меня есть два поля ввода, одно для пароля и другое для подтверждения пароля. Я хочу создать пользовательский механизм связывания, который позволит мне сравнивать значения обоих полей ввода, а также проверять минимальное количество символов. У меня был довольно похожий вопрос, но не касающийся сравнения двух разных полей ( Есть ли какой-нибудь оператор Приоритета в RxSwift? ) и основанный на ответе на предыдущий вопрос, который я пытался сделать что-то вроде этого :
enum PasswordCreateValidation {
case valid
case lessThanMinimum
case confirmationLessThanMinimum
case differentInputs
}
extension Reactive where Base: [InputField] {
var rxPassword: Binder<PasswordCreateValidation> {
return Binder<[InputField]>(self.base) { control, value in
switch value {
case .valid :
control[0].errorLabel.isHidden = true
control[1].errorLabel.isHidden = true
control[0].separator.backgroundColor = .white
control[1].separator.backgroundColor = .white
case .lessThanMinimum:
control[0].errorLabel.isHidden = false
control[0].separator.backgroundColor = .red
control[0].errorLabel.text = "Needs more chars"
case .confirmationLessThanMinimum:
control[1].errorLabel.isHidden = false
control[1].separator.backgroundColor = .red
control[1].errorLabel.text = "Needs more chars"
case .differentInputs:
control[0].errorLabel.isHidden = false
control[0].separator.backgroundColor = .red
control[0].errorLabel.text = "Inputs are not the same"
control[1].errorLabel.isHidden = false
control[1].separator.backgroundColor = .red
control[1].errorLabel.text = "Inputs are not the same"
}
}
}
}
...
private func bind() {
let codeMinimum = codeInputField.textField.rx.text.orEmpty.map { $0.count >= 1 }.skip(2)
codeMinimum.bind(to: codeInputField.rx.nonEmpty).disposed(by: bag)
let minimumAmountPassword = 8
pwdInputField.minimumAmountOfChars = minimumAmountPassword
confirmPwdInputField.minimumAmountOfChars = minimumAmountPassword
let pwdMinimum = pwdInputField.textField
.rx.text.orEmpty.map { $0.count >= minimumAmountPassword }.skip(2)
let confPwdMinimum = confirmPwdInputField.textField
.rx.text.orEmpty.map { $0.count >= minimumAmountPassword }.skip(2)
pwdMinimum.bind(to: pwdInputField.rx.minimumChars).disposed(by: bag)
confPwdMinimum.bind(to: confirmPwdInputField.rx.minimumChars).disposed(by: bag)
let pwdEqualA = pwdInputField.textField.rx.text.orEmpty
.map { $0 == self.confirmPwdInputField.value }.skip(2)
let pwdEqualB = confirmPwdInputField.textField.rx.text.orEmpty
.map { $0 == self.pwdInputField.value }.skip(2)
let equality = Observable.combineLatest(pwdEqualA, pwdEqualB) { $0 && $1 }
let minimum = Observable.combineLatest(pwdMinimum, confPwdMinimum) { $0 && $1 }
let pwdValidation = Observable.combineLatest(equality, minimum) { $0 && $1 }
Observable.combineLatest(pwdValidation, codeMinimum) { $0 && $1 }
.startWith(false)
.bind(to: signInButton.rx.isActive)
.disposed(by: bag)
}
Кажется, мой пользовательский переплет неправильный. не разрешено иметь массив в качестве базы?