测试已验证 | ✓ |
Lang语言 | SwiftSwift |
许可证 | MIT |
发布最后发布 | 2017年10月 |
SwiftSwift 版本 | 4.0 |
SPM支持 SPM | ✗ |
由 Andres Canal 维护。
SwiftCop 是一个完全用 Swift 编写的验证库,其灵感来自于 Ruby On Rails Active Record 验证的清晰性。
为 Swift 中的验证构建一个标准的、易于扩展的库,以便用户可以轻松创建自定义验证。同时避免开发者反复为不同项目编写相同的代码和验证。
SwiftCop 依据三个不同的概念构建
Trial
是一个实现 TrialProtocol
的 Enum
public protocol TrialProtocol {
func trial() -> ((_ evidence: String) -> Bool)
}
我们可以使用 Trial
来快速验证 strings
。SwiftCop 提供了非常完整的 Trial
实现。以下提供了一些 trials
Exclusion([String])
此功能验证属性是否不在证据字符串中。
let exclusionTrial = Trial.exclusion([".com",".ar", ".uy"])
let trial = exclusionTrial.trial()
XCTAssertFalse(trial("http://www.nytimes.com"))
XCTAssertFalse(trial("http://www.lanacion.com.ar"))
XCTAssertTrue(trial("http://www.elpais.es"))
Format(String)
此功能验证证据是否与给定的正则表达式匹配。
let formatTrial = Trial.format("^#([a-f0-9]{6}|[a-f0-9]{3})$") // hexa number with #
let trial = formatTrial.trial()
XCTAssertTrue(trial("#57b5b5"))
XCTAssertFalse(trial("57b5b5"))
XCTAssertFalse(trial("#h7b5b5"))
Inclusion([String])
此功能验证属性是否在证据字符串中。
let inclusionTrial = Trial.inclusion([".com",".ar", ".uy"])
let trial = inclusionTrial.trial()
XCTAssertTrue(trial("http://www.nytimes.com"))
XCTAssertTrue(trial("http://www.lanacion.com.ar"))
XCTAssertFalse(trial("http://www.elpais.es"))
Email
此功能验证证据是否为邮箱地址。
let emailTrial = Trial.email
let trial = emailTrial.trial()
XCTAssertTrue(trial("[email protected]"))
Length(Length,Any)
此功能验证给定证据的长度。
let lengthTrial = Trial.Length(.Is, 10)
let trial = lengthTrial.trial()
XCTAssertTrue(trial("0123456789"))
let lengthTrial = Trial.Length(.Minimum, 10)
let trial = lengthTrial.trial()
XCTAssertTrue(trial("0123456789"))
let lengthTrial = Trial.Length(.Maximum, 10)
let trial = lengthTrial.trial()
XCTAssertTrue(trial("0123456789"))
let interval = Trial.Length(.In, 2..<5 as HalfOpenInterval)
let trial = interval.trial()
XCTAssertTrue(trial("1234"))
let interval = Trial.Length(.In, 2...5 as ClosedInterval)
let trial = interval.trial()
XCTAssertFalse(trial("123456"))
Suspect
是一个 Struct
,它是其他在验证字段时始终使用的概念的粘合剂。它将 UITextField
与证据源、如果 Suspect
有罪(当 Trial
返回 false 时)将显示的句子以及 Trial
本身结合在一起,该 Trial
可以是针对嫌疑人的自定义 made trial,或者您可以使用库中提供的 trials 之一
Suspect(view: UITextField, sentence: String, trial: TrialProtocol)
Suspect(view: UITextField, sentence: String, trial: (String) -> Bool)
我们可以使用以下方法来检查 Suspect
是否有罪
func isGuilty() -> Bool
如果 Trial
返回 false
,则此方法将返回 true
。
我们还可以直接要求 Suspect
的 verdict
,这将检查是否有罪,然后返回空字符串(""
)或句子。
例如
let suspect = Suspect(view: self.dummyTextField, sentence: "Invalid email", trial: .Email)
let verdict = suspect.verdict() // this can be "" or "Invalid Email"
最后,我们将有一个人来执行验证!警察将收集所有嫌疑人,并给我们提供检查哪些嫌疑人有罪或是否有任何有罪嫌疑人的工具。
正如您所想,这将使警察对一名嫌疑人进行监控,我们可以添加任意多的嫌疑人
open func addSuspect(_ suspect: Suspect)
这允许我们检查在我们的警察监控下的所有嫌疑人中是否有任何有罪的嫌疑人
public func anyGuilty() -> Bool
这将使我们了解警察找到的所有有罪嫌疑人
public func allGuilties() -> Array<Suspect>
这允许我们检查一个被怀疑的用户界面字段是否是有罪的
public func isGuilty(textField: UITextField) -> Suspect?
示例已在存储库中提供
class ViewController: UIViewController {
@IBOutlet weak var validationLabel: UILabel!
@IBOutlet weak var fullNameMessage: UILabel!
@IBOutlet weak var emailMessage: UILabel!
@IBOutlet weak var passwordMessage: UILabel!
@IBOutlet weak var fullName: UITextField!
@IBOutlet weak var emailTextField: UITextField!
@IBOutlet weak var password: UITextField!
let swiftCop = SwiftCop()
override func viewDidLoad() {
super.viewDidLoad()
swiftCop.addSuspect(Suspect(view: self.fullName, sentence: "More Than Two Words Needed"){
return $0.components(separatedBy: " ").filter{$0 != ""}.count >= 2
})
swiftCop.addSuspect(Suspect(view:self.emailTextField, sentence: "Invalid email", trial: Trial.email))
swiftCop.addSuspect(Suspect(view:self.password, sentence: "Minimum 4 Characters", trial: Trial.length(.minimum, 4)))
}
@IBAction func validateFullName(_ sender: UITextField) {
self.fullNameMessage.text = swiftCop.isGuilty(sender)?.verdict()
}
@IBAction func validateEmail(_ sender: UITextField) {
self.emailMessage.text = swiftCop.isGuilty(sender)?.verdict()
}
@IBAction func validatePassword(_ sender: UITextField) {
self.passwordMessage.text = swiftCop.isGuilty(sender)?.verdict()
}
@IBAction func allValid(_ sender: UITextField) {
let nonGultiesMessage = "Everything fine!"
let allGuiltiesMessage = swiftCop.allGuilties().map{ return $0.sentence}.joined(separator: "\n")
self.validationLabel.text = allGuiltiesMessage.characters.count > 0 ? allGuiltiesMessage : nonGultiesMessage
}
@IBAction func hideKeyboard(_ sender: AnyObject) {
self.view.endEditing(true)
}
}
您可以直接克隆存储库并将 SwiftCop
文件夹复制到您的项目中,或者您可以选择以下任一选项