ValidationToolkit 0.6.0

ValidationToolkit 0.6.0

测试已测试
Lang语言 SwiftSwift
许可协议 MIT
发布上次发布2018年5月
SPM支持SPM

Alex Cristea维护。



Validation Toolkit

badge-travis badge-codecov badge-carthage badge-license badge-twitter version-badge

  1. 简介
  2. 要求
  3. 安装
  4. 使用示例
  5. 贡献
  6. 元数据

简介

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项目。

设置Carthage

Carthage是一个去中心化依赖管理器,构建您的依赖并为您提供二进制框架。

您可以使用以下命令使用Homebrew安装Carthage

$ brew update
$ brew install carthage

使用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部署目标。

设置CocoaPods

CocoaPods是Cocoa项目的依赖管理器。您可以使用以下命令安装:

$ gem install cocoapods

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页面

手动安装

为了在项目中手动使用这个库,您可以

  1. 对于项目,只需将“Sources”文件夹拖放到项目树中
  2. 对于工作空间,包括整个“ValidationToolkit.xcodeproj

使用示例

要查看示例的完整列表,请尝试ValidationToolikit.playground

  1. 在您的机器上本地下载存储库
  2. 打开ValidationToolkit.workspace
  3. 构建ValidationToolkit iOS目标
  4. 从项目导航中选择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: "[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表示一种数据类型,将PredicateError链接起来,以便为最终用户提供有用的反馈。

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的成员开发和维护。

该项目采用MIT许可协议发布。更多信息请见LICENSE

[https://github.com/nsagora/validation-toolkit]

鸣谢及参考

我们从其他开源项目中获得灵感,以下列举以作参考。