Validation Toolkit
简介
ValidationToolkit
是一个轻量级的框架,专注于数据验证,如电子邮件格式、输入长度或密码匹配。
此项目的核心原则包括以下内容
- 关注点分离
- 适用于所有平台
- 可扩展性
关注点分离
将ValidationToolkit
视为可调节扳手,而不是瑞士军刀。
本着这一理念,工具包由一小套协议、结构体和类组成,可以轻松组合以适应项目的需求。
所有平台可用性
由于验证可以发生在多个层面,ValidationToolkit
设计用于支持iOS、macOS、tvOS、watchOS和本地Swift项目,例如服务器应用。
支持扩展
每个项目都有其独特的挑战,当我们能专注于解决问题而不是花时间在样板任务上时,那就太好了。
ValidationToolkit
小巧轻便,为你提供了构建围绕项目需求的数据验证所需的基础。此外,它包含了一组常见验证谓词,大多数项目都能从中受益:电子邮件验证、必填字段、密码匹配、URL验证等等。
要求
- iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+
- Xcode 8.1+
- Swift 3.0+
安装
Carthage
您可以使用Carthage通过在Cartfile
中添加它来安装ValidationToolkit
github "nsagora/validation-toolkit"
运行carthage update
来构建框架并将构建好的ValidationToolkit.framework
拖入您的Xcode项目。
使用CocoaPods
您可以通过将以下内容添加到CocoaPods Podfile文件中来安装ValidationToolkit
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!
target 'YOUR_TARGET_NAME' do
pod 'ValidationToolkit'
end
然后,执行以下命令
$ pod install
请注意,这需要CocoaPods版本1.0.0以及至少8.0的iOS部署目标。
Swift包管理器
您可以使用Swift包管理器通过将下面添加到您的Package.swift
文件中来安装ValidationToolkit
import PackageDescription
let package = Package(
name: "YOUR_PROJECT_NAME",
targets: [],
dependencies: [
.Package(url: "https://github.com/nsagora/validation-toolkit", majorVersion: 1),
]
)
请注意,Swift包管理器仍然处于早期设计和开发阶段,更多详细信息请查看其GitHub页面。
手动安装
为了在项目中手动使用这个库,您可以
- 对于项目,只需将“
Sources
”文件夹拖放到项目树中 - 对于工作空间,包括整个“
ValidationToolkit.xcodeproj
”
使用示例
要查看示例的完整列表,请尝试ValidationToolikit.playground
- 在您的机器上本地下载存储库
- 打开
ValidationToolkit.workspace
- 构建
ValidationToolkit iOS
目标 - 从项目导航中选择
ValidationToolkit
playgrounds。
谓词
谓词
代表核心的`protocol`,其作用是评估输入是否在给定的验证条件下匹配。
在`ValidationToolkit`的核心中,我们有以下两个谓词,开发人员可以组合这些谓词以适应项目特定需求。
RegexPredicate
let predicate = RegexPredicate(expression: "^[a-z]$")
predicate.evaluate(with: "a") // returns true
predicate.evaluate(with: "5") // returns false
predicate.evaluate(with: "ab") // returns false
BlockPredicate
let pred = BlockPredicate<String> { $0.characters.count > 2 }
predicate.evaluate(with: "a") // returns false
predicate.evaluate(with: "abc") // returns true
此外,工具包还提供了一套常用的验证谓词,您可以从您的项目中受益
EmailPredicate
let predicate = EmailPredicate()
predicate.evaluate(with: "hello@") // returns false
predicate.evaluate(with: "[email protected]") // returns true
predicate.evaluate(with: "hé[email protected]") // returns true
URLPredicate
let predicate = URLPredicate()
predicate.evaluate(with: "http://www.url.com") // returns true
predicate.evaluate(with: "http:\\www.url.com") // returns false
PairMatchingPredicate
let predicate = PairMatchingPredicate()
predicate.evaluate(with: ("swift", "swift")) // returns true
predicate.evaluate(with: ("swift", "obj-c")) // returns false
在此基础上,开发人员可以通过扩展Predicate
协议以及/或组合或装饰现有的谓词来构建更高级或复杂的谓词
自定义谓词
public class MinLenghtPredicate: Predicate {
public typealias InputType = String
private let minLenght:Int
public init(minLenght:Int) {
self.minLenght = minLenght
}
public func evaluate(with input: String) -> Bool {
return input.characters.count >= minLenght
}
}
let predicate = MinLenghtPredicate(minLenght: 5)
predicate.evaluate(with: "alph") // returns false
predicate.evaluate(with: "alpha") // returns true
predicate.evaluate(with: "alphabet") // returns true
约束
PredicateConstraint
表示一种数据类型,将Predicate
与Error
链接起来,以便为最终用户提供有用的反馈。
PredicateConstraint
let predicate = BlockPredicate<String> { $0 == "Mr. Goodbytes" }
let constraint = PredicateConstraint(predicate: predicate, error: MyError.magicWord)
let result = constraint.evaluate(with: "please")
switch result {
case .valid:
print("access granted...")
case .invalid(let summary):
print("Ah Ah Ah! You didn't say the magic word!")
} // prints "Ah Ah Ah! You didn't say the magic word!"
enum MyError:Error {
case magicWord
}
约束集
ConstraintSet
代表一组约束,可以对这些约束进行评估
- 任何约束
- 所有约束
为了提供上下文,ConstraintSet
允许我们将数据项约束为必须的,以及约束为有效的电子邮件。
ConstraintSet
举个例子是注册表单,其中用户被提示输入一个强密码。这个过程通常涉及某种形式的验证,但逻辑本身通常是结构化的,分散在视图控制器中。ValidationToolkit
旨在整合、标准化并明确用户输入验证所使用的逻辑。为此,以下示例演示了构建一个完整的ConstraintSet
对象的方法,该对象可以用来强制执行用户密码数据的规则
let lowerCase = RegexPredicate(expression: "^(?=.*[a-z]).*$")
let upperCase = RegexPredicate(expression: "^(?=.*[A-Z]).*$")
let digits = RegexPredicate(expression: "^(?=.*[0-9]).*$")
let specialChars = RegexPredicate(expression: "^(?=.*[!@#\\$%\\^&\\*]).*$")
let minLenght = RegexPredicate(expression: "^.{8,}$")
var passwordConstraints = ConstraintSet<String>()
passwordConstraints.add(predicate: lowerCasePredicate, error: Form.Password.missingLowercase)
passwordConstraints.add(predicate: upperCasePredicate, error: Form.Password.missingUpercase)
passwordConstraints.add(predicate: digitsPredicate, error: Form.Password.missingDigits)
passwordConstraints.add(predicate: specialChars, error: Form.Password.missingSpecialChars)
passwordConstraints.add(predicate: minLenght, error: Form.Password.minLenght(8))
let password = "3nGuard!"
let result = passwordConstraints.evaluateAll(input: password)
switch result {
case .valid:
print("Wow, that's a 💪 password!")
case .invalid(let summary):
print(summary.errors.map({$0.localizedDescription}))
} // prints "Wow, that's a 💪 password!"
从上面我们可以看到,一旦我们构建了passwordConstraints
,我们仅需调用evaluateAll(input:=)
来获取我们的评估结果摘要。然后我们可以按需处理此摘要。
贡献力量
我们期待您对ValidationToolkit的贡献,有关更多信息,请查看LICENSE
文件。
元信息
本项目由罗马尼亚尼亚什市iOS开发者社区iOS NSAgora的成员开发和维护。
[https://github.com/nsagora/validation-toolkit]
鸣谢及参考
我们从其他开源项目中获得灵感,以下列举以作参考。