GenericValidator 0.0.8

GenericValidator 0.0.8

测试测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2019年7月
SPM支持SPM

Thibault KleinThibault Klein维护。



  • Thibault Klein

GenericValidator

Travis build status Cocoapods Compatible Platform Docs

描述

GenericValidator提供了一组辅助函数和协议,用于帮助验证符合EvaluatableValidatable协议的任何类型的数据。验证协议接受返回验证结果的函数,这些结果可以是有效的或无效的。无效情况包含您提供的自定义错误,而最终结果将列出验证过程中发生的所有错误。

该框架提供了可以直接用于验证内容的UITextFieldString扩展。

您也可以让您的自定义类型符合EvaluatableValidatable协议,以便为您自己的代码提供更定制化的验证。

关于示例,请参见用法部分。

本框架受到了以下博客文章的启发

要求

  • iOS 9+
  • Xcode 10
  • Swift 5+

安装

要在您的项目中使用,只需将以下行添加到您的Podfile中:

pod 'GenericValidator'

然后您可以通过将其导入到您的文件中使用GenericValidator。

import GenericValidator

使用方法

GenericValidator提供了2个扩展,您可以直接在UITextFieldString上使用。其中UITextField扩展提供了一个验证函数,而String扩展提供了一个评估函数。

以下是一个示例,您可以使用String扩展来评估字符串是否为有效的信用卡CVC号,并通过传递评估函数来验证文本字段

enum ValidationError: Error {
    case error(String)
}

typealias CVCValidationResult = ValidationResult<ValidationError>

func isCVCValid(text: String) -> CVCValidationResult {
    let regexp = "^[0-9]{3,4}$"
    if text.evaluate(with: regexp) {
        return .valid
    }

    return .invalid([ValidationError.error("The CVC is invalid")])
}

let cvcTextField = UITextField()
cvcTextField.text = "123"
let result = cvcTextField.validate([isCVCValid]) // result is valid

cvcTextField.text = "12a"
let result = cvcTextField.validate([isCVCValid]) // result is invalid, with error "The CVC is invalid"

您还可以遵守协议来评估和验证自定义类型。

以下是一个示例,描述如何验证用户

enum ValidationError: Error {
    case error(String)
}

struct User {
    let firstName: String
    let lastName: String
    let age: Int
}

typealias UserValidationResult = ValidationResult<ValidationError>

extension User: Validatable {

    func validate(_ functions: [(User) -> UserValidationResult]) -> UserValidationResult {
		return functions.map({ f in f(self) }).reduce(UserValidationResult.valid) { $0.combine($1) }
    }

}

func isUserNameValid(user: User) -> UserValidationResult {
    let regexp = "[A-Za-z]+$"
    if user.firstName.evaluate(with: regexp)
        && user.lastName.evaluate(with: regexp) {
        return .valid
    }

    return .invalid([ValidationError.error("The user name is invalid")])
}

func isUserAdult(user: User) -> ValidationResult {
    if user.age >= 18 {
        return .valid
    }

    return .invalid([ValidationError.error("The user is not an adult")])
}

let user = User(firstName: "Thibault", lastName: "Klein", age: 26)
let result = user.validate([isUserNameValid, isUserAdult]) // result is valid

let user = User(firstName: "Thibault", lastName: "Klein", age: 17)
let result = user.validate([isUserNameValid, isUserAdult]) // result is invalid with error "The user is not an adult"

let user = User(firstName: "12345", lastName: "Klein", age: 17)
let result = user.validate([isUserNameValid, isUserAdult]) // result is invalid with errors "The user name is invalid" and "The user is not an adult"

为GenericValidator做出贡献

要报告错误或增强请求,请随意在相应标题下提交问题。

如果您希望为此项目做出贡献,请分支此存储库并提交一个pull请求。