Validator 是一个用 Swift 编写的框架,它提供可用于验证输入值内容的功能。
该软件包包含两个库:ValidatorCore
包含所有验证逻辑和预定义的验证器,而 ValidatorUI
实现了将验证器集成到 UI 对象中的扩展。它同时支持 SwiftUI
和 UIKit
。
如果您需要验证一些数据,您可以按如下方式使用 Validator
对象来实现此目的
import ValidatorCore
let validator = Validator()
let result = validator.validate(input: "text", rule: LengthValidationRule(min: 4, error: "error text"))
switch result {
case .valid:
print("text is valid")
case let .invalid(errors):
// handle validation errors
print(errors)
}
如果您想验证用户的输入数据,您可以导入 ValidatorUI
并将验证逻辑集成到 UI 组件中。您的 UI 对象必须遵循 IUIValidatable
协议,该协议要求定义 inputValue
和 validateOnInputChange(_:)
方法。
ValidatorUI
支持扩展,以便将验证器方便地集成到 UITextField
对象中
import UIKit
import ValidatorUI
import ValidatorCore
class ViewController: UIViewController {
let textField: UITextField = UITextField()
override func viewDidLoad() {
super.viewDidLoad()
/// Adds validation rule to the text field.
textField.add(rule: LengthValidationRule(max: 10, error: "error text"))
/// Enables automatic validation on input change.
textField.validateOnInputChange(isEnabled: true)
/// Handle the validation result.
textField.validationHandler = { result in
switch result {
case .valid:
print("text is valid")
case let .invalid(errors):
print(errors)
}
}
}
/// Setup UITextField ...
}
如果您需要验证单个字段,您可以使用验证视图扩展并在验证处理程序中处理验证结果
import SwiftUI
import ValidatorUI
import ValidatorCore
struct ContentView: View {
@State private var text: String = ""
private let validationRules: [any IValidationRule<String>] = [
LengthValidationRule(max: 10, error: "Text error")
]
var body: some View {
VStack {
TextField("Text", text: $text)
.validation($text, rules: validationRules) { result in
// Handle a validation result here
}
}
}
}
您还可以使用视图修饰符,您可以在其中传递错误视图
import SwiftUI
import ValidatorUI
import ValidatorCore
struct ContentView: View {
@State private var text: String = ""
private let validationRules: [any IValidationRule<String>] = [
LengthValidationRule(max: 10, error: "Text error")
]
var body: some View {
VStack {
TextField("Text", text: $text)
.validate(item: $text, rules: validationRules) { errors in
Text("Text is bigger than 10 characters")
}
}
}
}
ValidatorUI
支持表单验证。如果您的屏幕包含多个输入字段,并且您想在一个地方处理验证结果,您可以按如下方式使用验证表单管理器
import SwiftUI
import ValidatorUI
import ValidatorCore
class Form: ObservableObject {
@Published
var manager = FormFieldManager()
@FormField(rules: [LengthValidationRule(max: 20, error: "The first name is very long")])
var firstName: String = ""
@FormField(rules: [LengthValidationRule(min: 5, error: "The last name is too short")])
var lastName: String = ""
lazy var firstNameValidationContainer = _firstName.validate(manager: manager)
lazy var lastNameValidationContainer = _lastName.validate(manager: manager)
}
struct ContentView: View {
@ObservedObject private var form = Form()
var body: some View {
VStack {
TextField("First Name", text: $form.firstName)
.validate(validationContainer: form.firstNameValidationContainer) { errors in
Text(errors.map { $0.message }.joined(separator: " "))
}
TextField("Last Name", text: $form.lastName)
.validate(validationContainer: form.lastNameValidationContainer) { errors in
Text(errors.map { $0.message }.joined(separator: " "))
}
Button(action: { self.form.manager.validate() }, label: { Text("Validate") })
Spacer()
}
.onReceive(
form.manager.$isValid,
perform: { value in
if value {
print("The form's fields are valid")
} else {
print("The form's fields aren't valid")
}
}
)
}
}
Validator | 描述 |
---|---|
LengthValidationRule | 验证字符串是否与特定长度匹配 |
NonEmptyValidationRule | 验证字符串是否为空或空白 |
PrefixValidationRule | 验证字符串是否包含前缀 |
SuffixValidationRule | 验证字符串是否包含后缀 |
RegexValidationRule | 验证是否匹配模式 |
要实现自定义验证规则,您可以遵循 IValidationRule
协议,该协议要求定义验证类型并实现验证逻辑。例如
/// A non empty validation rule.
public struct NonEmptyValidationRule: IValidationRule {
// MARK: Types
public typealias Input = String
// MARK: Properties
/// The validation error.
public let error: IValidationError
// MARK: Initialization
public init(error: IValidationError) {
self.error = error
}
// MARK: IValidationRule
public func validate(input: String) -> Bool {
!input.isEmpty
}
}
Swift Package Manager 是一种用于自动化 Swift 代码分发的工具,并已集成到 swift
编译器中。它尚处于早期开发阶段,但 validator
确实支持在受支持的平台上使用它。
一旦您设置好 Swift 包,添加 validator
作为依赖项就像将其添加到 Package.swift
的 dependencies
值一样容易。
dependencies: [
.package(url: "https://github.com/space-code/validator.git", .upToNextMajor(from: "1.1.0"))
]
引导开发环境
make bootstrap
请随时帮助改进这个项目!如果您发现任何可以改进的地方或想要新功能,请打开一个 issue 或发送 Pull Request!
Nikita Vasilev, nv3212@gmail.com
validator 在 MIT 许可证下可用。有关更多信息,请参见 LICENSE 文件。