SwiftRuler 2.1.0

SwiftRuler 2.1.0

Rawipon SrivibhaSiwasit Anmahapong 维护。



  • Rawipon Srivibha

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。

作者