Validator: xxxxx

验证器

Licence Swift Compatibility Platform Compatibility CI

描述

Validator 是一个用 Swift 编写的框架,它提供可用于验证输入值内容的功能。

用法

该软件包包含两个库:ValidatorCore 包含所有验证逻辑和预定义的验证器,而 ValidatorUI 实现了将验证器集成到 UI 对象中的扩展。它同时支持 SwiftUIUIKit

基本用法

如果您需要验证一些数据,您可以按如下方式使用 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)
}

UIKit

如果您想验证用户的输入数据,您可以导入 ValidatorUI 并将验证逻辑集成到 UI 组件中。您的 UI 对象必须遵循 IUIValidatable 协议,该协议要求定义 inputValuevalidateOnInputChange(_:) 方法。

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 ...
}

SwiftUI

如果您需要验证单个字段,您可以使用验证视图扩展并在验证处理程序中处理验证结果

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")
                }
        }
    }
}

SwiftUI 表单

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 Package Manager 是一种用于自动化 Swift 代码分发的工具,并已集成到 swift 编译器中。它尚处于早期开发阶段,但 validator 确实支持在受支持的平台上使用它。

一旦您设置好 Swift 包,添加 validator 作为依赖项就像将其添加到 Package.swiftdependencies 值一样容易。

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 文件。