SwiftRuler
减少迭代编程复杂度的模块。通过使用规则来验证候选者。
概念
SwiftRuler 将从以下内容。
if firstNameTextField.text?.isEmpty ||
lastNameTextField.text?.isEmpty ||
passwordTextField.text?.isEmpty {
print("Field Missing")
} else if let password = passwordTextField.text {
if password.count > 8 {
print("Password is Too Short")
} else if password.contain(" ") {
print("Password Contains Space")
}
} else {
print ("User Created")
}
变为此。
var ruler = Ruler()
ruler.add(firstNameTextField, rule: EmptyStringRule(), userInfo: "Field Missing")
ruler.add(lastNameTextField, rule: EmptyStringRule(), userInfo: "Field Missing")
ruler.add(passwordTextField, rule: EmptyStringRule(), userInfo: "Field Missing")
ruler.add(passwordTextField, rule: StringRangeRule(min: 8), userInfo: "Password is Too Short")
ruler.add(passwordTextField, rule: RegexRule("\\s"), userInfo: "Password Contains Space")
guard let result = ruler.validate() {
print(result.userInfo)
return
}
print("User Created")
}
示例
要运行示例项目,请先克隆仓库,然后从 Example 目录中运行 pod install
。
安装
SwiftRuler 通过 CocoaPods 提供。要安装,只需将以下行添加到您的 Podfile 中:
pod "SwiftRuler"
用法
SwiftRuler 是基于规则的元素验证。其概念是在初始阶段预先设置规则,稍后验证。这样可以避免大量的迭代编程,并保持代码的可读性。以下是使用示例:
class ViewController: UIViewController {
@IBOutlet weak var usernameTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
let ruler = Ruler()
override func viewDidLoad() {
super.viewDidLoad()
// Add rule
ruler.add(usernameTextField, rule: EmptyStringRule(), userInfo: "Username must not empty.")
ruler.add(passwordTextField, rule: EmptyStringRule(), userInfo: "Password must not empty.")
ruler.add(passwordTextField, rule: StringRangeRule(min: 6), userInfo: "Password must contain 6 or more characters.")
}
@IBAction func validate() {
/// Validate rule
if let error = ruler.validate() {
// Fail
showAlert(error.userInfo)
return
}
// Success
submit()
}
}
添加规则
将单个规则添加到一个元素中
ruler.add(textField, rule: EmptyStringRule(), userInfo: "Text must not empty.")
将多个规则添加到一个元素中
ruler.add(textField, rules: [EmptyStringRule(), EmailRule()], userInfo: "Text isn't email.")
将多个规则(具有不同的 userInfo)添加到单个元素中
ruler.add(textField,
rules: [(EmptyStringRule(), userInfo: "Text must not empty."),
(EmailRule(), userInfo: "Text isn't email.")])
UserInfo 还可以发送其他类型的对象,例如字典、数组、字符串。
验证
针对第一个错误进行验证。如果有错误,该方法将返回第一个错误。
let error = ruler.validate()
guard error == nil else {
// Fail
}
// Pass
针对所有错误进行验证。如果有错误,该方法将返回错误数组。
let errors = ruler.validateAll()
guard errors.isEmpty else {
// Fail
return
}
// Pass
如果要验证预先添加到列表中的候选人,可以调用并立即添加候选人。
guard EmailRule().validate(candidate: instanceText) else {
// Fail
return
}
// Pass
规则
SwiftRuler 包含一些规则供您使用。以下是规则列表:
ConnectToInternetRule
用于检查设备是否可以连接到互联网的规则。不需要候选人。
ConnectToInternetRule()
DateTimeRule
用于检查候选人在特定日期和时间之间的时间范围内的规则。需要候选人进行检查。以下是该规则的性能:
- MinimumDateTime:检查的最小日期时间,默认为当前日期时间
- MaximumDateTime:检查的最大日期时间,默认为当前日期时间加100年。
- DateTimeFormatter:将字符串候选人转换为日期对象的格式化程序。默认为 "dd/MM/yy-hh:mm:ss",带有当前区域设置。
DateTimeRule(min: newDate, max: Date(timeIntervalSinceNow: 604800), formatter: dateFormatter.dateFormat)
电子规则
规则用于检查候选人是否在电子格式中。候选人必须进行检查。
EmailRule()
空字符串规则
规则用于检查候选人是否为空。使用必填字段。候选人必须进行检查。ignoreCharacterSet用于指定在验证时希望忽略的字符集。
EmptyStringRule()
EmptyStringRule(ignoreCharacterSet: .whiteSpace)
正则规则
规则用于检查候选人是否遵循正则表达式格式。候选人必须进行检查。以下是该规则的属性
- 表达式:正则表达式字符串。
RegexRule("[a-zA-Z]")
真规则
规则用于检查候选人是真值。候选人必须进行检查。
TrueRule()
假规则
规则用于检查候选人是假值。候选人必须进行检查。
FalseRule()
字符串范围规则
规则用于检查候选人的字符是否在范围内。候选人必须进行检查。以下是该规则的属性
- 范围:检查的范围。默认为0 ... Int.max
- 反转:如果设置为true,则反转规则。默认为false。
StringRangeRule(3...8, inverted: false)
StringRangeRule(max: 12)
自定义规则
您可以通过符合Rule协议或继承StringRule来创建基于字符串的规则类来创建自定义规则。
class IsARule: Rule {
func validate(candidate: Any?) {
return candidate as? String == "A"
}
}
Rulable
SwiftRuler只能验证符合Rulable协议的元素。以下是一些已经被指定为Rulable的UI元素:
- UITextField:捕获text参数。
- UITextView:捕获text参数。
- UISwitch:捕获isOn参数。
- UIButton:捕获isSelected参数。
- UILabel:捕获text参数。
- 原始对象:String, Int, Double, Float, Bool。
TrimStringRuler这个Rulable支持在验证前修剪字符串。
let ruler = Ruler()
ruler.add(TrimStringRulable(rulable: usernameTextField, trimmingCharacters: .whitespacesAndNewlines), rule: EmptyStringRule())
ruler.add(emailTextField.rulable(byTrimmingStringIn: .whitespacesAndNewlines), rule: EmailRule()) // or using Rulable extension
ruler.validate()
比较Rulable
这是一个自定义Rulable,用于检查两个候选项的值。这会捕获值在Rulable UI元素中,并进行比较。比较值应该是相同类型,这个Rulable会返回Bool值作为规则。以下是一个示例:
let rulable = CompareRulable(candidate: passwordTextField,
other: confirmPasswordTextField)
ruler(rulable,
rule: TrueRule(),
userInfo: "Password is not match, Please try again.")
规则块
SwiftRuler可以使用块来进行快速验证。
let ruleBlock = RuleBlock {
return passwordTextField.text == confirmPasswordTextField.text
}
ruler.add(ruleBlock,
rule: TrueRule(),
userInfo: "Password not equal.")
自定义Rulable
您还可以通过定义candidateValue来让SwiftRuler验证自定义视图的值,使得符合Rulable协议。
class CustomView: UIView, Rulable {
let customTextField = UITextField()
var candidateValue: Any? {
return customTextField.text
}
}
更改日志
- 版本 1.0.0
- 初始化版本
- 版本 1.1.0
- 将标准对象(String, Int, Double, Float 和 Bool)作为 Rulable 对象添加。
- 版本 1.1.1
- 修复原生日类型不支持 Rulable 的问题。
- 版本 1.2.0
- 在 EmptyStringRule 初始化中添加 IgnoreCharacterSet。
- 版本 1.2.1
- 修复 Email 规则以验证整个单词。
- 版本 1.3.0
- 添加 TrimStringRulable 以支持在验证前修剪字符串。
- 版本 1.3.1
- 修复在 StringRule 上的编译错误。
- 版本 2.0.0
- 移除对 Object C 的支持。
- 在用户信息上添加泛型类型。
- 版本 2.0.1
- 从规则中移除 NSObject。
- 版本 2.0.2
- 从正则表达式规则中移除不区分大小写的选项。
- 升级到 Swift 5。