swift - 电子邮件验证器 RxSwift?
问题描述
我正在使用 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 中,我完全不知道如何解决它?
谢谢。
解决方案
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)
推荐阅读
- python - 如何使用 Bokeh 在每一行中添加标签
- c - scanf 接受一个带空格的字符串,然后接受一个字符
- r - 从 ggplot geom_crossbar 中删除等高线
- sql - 从 SQL DDL 语句的现有表中筛选列名
- python-3.x - Telebot API Python3
- python - 检查未知类型的参数
- hibernate - Spring Data Jpa 延迟加载未按预期工作
- r - 我想在 r 中找到连接最多的节点作为网络对象
- lisp - LISP 编程 - 很想知道该代码的作用
- powershell - 如何使用 Windows PowerShell 远程更改用户密码?