【问题标题】:Email Validator RxSwift?电子邮件验证器 RxSwift?
【发布时间】:2018-10-23 09:32:36
【问题描述】:

我正在使用 RxSwift

pod 'RxSwift',    '~> 4.0'
pod 'RxCocoa',    '~> 4.0'

我看到了用户名、密码验证的示例,因为它的工作原理类似于

 func validateUsername(_ username: String) -> Observable<ValidationResult> {
        if username.isEmpty {
            return .just(.empty)
        }


        // this obviously won't be
        if username.rangeOfCharacter(from: CharacterSet.alphanumerics.inverted) != nil {
            return .just(.failed(message: "Username can only contain numbers or digits"))
        }

        // this obviously won't be
        if username.rangeOfCharacter(from: CharacterSet.alphanumerics.inverted) != nil {
            return .just(.failed(message: "Username can only contain numbers or digits"))
        }

        let loadingValue = ValidationResult.validating

        return API
            .usernameAvailable(username)
            .map { available in
                if available {
                    return .ok(message: "Username available")
                }
                else {
                    return .failed(message: "Username already taken")
                }
            }
            .startWith(loadingValue)
    }

现在,我需要为电子邮件制作验证器,我在示例中没有找到任何内容如何做?

我曾经使用验证器 https://github.com/SwiftValidatorCommunity/SwiftValidator

validator.registerField(emailTextField, errorLabel: emailErrorLabel, rules: [RequiredRule(), EmailRule(message: "Invalid email")])

但是在 Rx 中,我完全不知道如何解决它?

谢谢。

【问题讨论】:

    标签: swift validation email-validation rx-swift


    【解决方案1】:
    final class EmailValidator {
    
        func validate(_ input: String) -> Bool {
            guard
                let regex = try? NSRegularExpression(
                    pattern: "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}",
                    options: [.caseInsensitive]
                )
            else {
                assertionFailure("Regex not valid")
                return false
            }
    
            let regexFirstMatch = regex
                .firstMatch(
                    in: input,
                    options: [],
                    range: NSRange(location: 0, length: input.count)
                )
    
            return regexFirstMatch != nil
        }
    }
    

    示例用法:

    let emailTextField = UITextField()
    let emailValidator = EmailValidator()
    
    emailTextField.rx.text
       .orEmpty
       .map(emailValidator.validate)
       .subscribe(onNext: { isValid in
           print(isValid)
       })
       .disposed(by: disposeBag)
    

    【讨论】:

      猜你喜欢
      • 2020-04-10
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多