PapersPlease 是一个灵活、可扩展的 iOS 文本验证库,使用苹果的 Swift 语言编写。该库的 Objective-C 版本是 PMValidation。PapersPlease 包含了用于验证注册表单等常用任务的一些常见验证类型,但它被设计成可以轻松扩展,以包含您自己的验证类型。
在最简单的实现中,PapersPlease 从 ValidatorType 子类的实例开始。这些类提供验证逻辑,可以直接用于执行单个字符串的验证测试。ValidatorType 可以子类化以提供自己的自定义验证逻辑。如果您需要执行更复杂的验证测试,需要多个 ValidatorType 子类并确定字符串的整体验证状态,则可以使用 ValidationUnit 类。当您需要验证多个字符串并确定全局验证状态(例如表单验证)时,ValidationManager 类很有用。此类控制一个或多个 ValidationUnit 对象,提供整体验证状态和通知路由。此类还简化了 UIKit 文本输入类的验证。
尽管这个库按照说明工作,但 Swift 语言仍在不断发展变化,因此这个库可能会在 Swift 稳定之前有显著变化。
如果您使用 CocoaPods
pod "PapersPlease", "~> 0.3.0"
或将类目录添加到您的项目中。
以下是一个基本示例,创建一个字符串长度约束,当字符串长度在 4 到 8 个字符之间时可以通过验证。
let length_type:ValidatorLengthType = ValidatorLengthType(minimumCharacters:4, maximumCharacters:8)
let unit:ValidationUnit = ValidationUnit(validatorTypes: [length_type], identifier: "unit")
[unit registerValidationType:length_type];
// get validation status update
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("validationUnitStatusChange:"), name: ValidationUnitUpdateNotification, object: unit)
// listen for validation status updates
@objc func validationUnitStatusChange(notification:NSNotification) {
let unit:ValidationUnit = notification.object as ValidationUnit
println("\(unit.identifier) is \(unit.valid)")
}
// validate the string
unit.validateText("Velvet Underground")
该示例只使用了一个验证类型类,但您可以添加任意多个来创建非常复杂的验证测试。当然,高级用户可能想要利用ValidatorRegexType类,该类允许使用正则表达式作为验证测试。对于复杂的用例,这可能更可取——ValidatorEmailType内部使用正则表达式——但使用更基本的类型类可以提供更好的可读性。具体效果因用户而异。
验证静态字符串很酷,但让我们将ValidatorUnit连接到UITextField,以便在其文本变化时动态验证。虽然我们只用ValidationUnit也能完成这个任务,但使用ValidationManager会更方便。
let manager = ValidationManager()
let email_type:ValidatorEmailType = ValidatorEmailType()
manager.registerTextField(self.textField, validationTypes: [email_type], identifier: "email")
// register for validation status updates
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("validationManagerStatusChange:"), name: ValidationStatusNotification, object: manager)
// listen for manager's validation updates
@objc func validationManagerStatusChange(notification:NSNotification) {
let user_info = notification.userInfo as Dictionary
let is_valid = (user_info["status"] as NSNumber).boolValue as Bool
if (!is_valid) {
let all_errors:NSDictionary = user_info["errors"] as NSDictionary
let email_dict:NSDictionary = all_errors[email_type.identifier] as NSDictionary
let email_errors:NSDictionary = email_dict["errors"] as NSDictionary
}
}
PapersPlease由Brett Walker创建,他来自Poet & Mountain。
PapersPlease遵循MIT许可证。