GenericValidator
描述
GenericValidator提供了一组辅助函数和协议,用于帮助验证符合Evaluatable
和Validatable
协议的任何类型的数据。验证协议接受返回验证结果的函数,这些结果可以是有效的或无效的。无效情况包含您提供的自定义错误,而最终结果将列出验证过程中发生的所有错误。
该框架提供了可以直接用于验证内容的UITextField
和String
扩展。
您也可以让您的自定义类型符合Evaluatable
和Validatable
协议,以便为您自己的代码提供更定制化的验证。
关于示例,请参见用法部分。
本框架受到了以下博客文章的启发
要求
- iOS 9+
- Xcode 10
- Swift 5+
安装
要在您的项目中使用,只需将以下行添加到您的Podfile中:
pod 'GenericValidator'
然后您可以通过将其导入到您的文件中使用GenericValidator。
import GenericValidator
使用方法
GenericValidator提供了2个扩展,您可以直接在UITextField
和String
上使用。其中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请求。