ValidationsKit
此套件的目标是将 vapor/validation 包引入 iOS,通过从中删除 Vapor 核心依赖来实现。
示例
将尝试将验证添加到 User
模型,以便满足例如注册过程的要求。
首先,我们要像往常一样描述它。
struct User {
let mail: String
let phone: String
let password: String
let website: String?
let twitter: String?
}
然后,我们必须通过添加 validations()
函数使该模型符合 Validatable
协议。这返回一个用于我们模型的 Validations
对象,并允许我们向它添加 Validator
。
与 Vapor 包一样,已经有一些您可以使用 Validator
(如 mail
、count
、empty
...)或者您可以通过闭包定义您自己的验证规则
extension User: Validatable {
static func validations() throws -> Validations<User> {
var validations = Validations(User.self)
// 'mail' should be a valid mail address.
validations.add(\.mail, ["mail"], .mail)
// 'phone' should be a valid phone number.
validations.add(\.phone, ["phone"], .phone)
// 'password' should have more than 8 characters.
validations.add(\.password, ["password"], .count(8...))
// 'website' should be nil or be a valid url.
validations.add(\.website, ["website"], .nil || .url)
// 'twitter' should be nil or began by '@'.
validations.add(\.twitter, at: ["twitter"]) { twitter in
guard let twitter = twitter else { return }
guard twitter.first != "@" else { return }
throw BasicValidationError("isn't a valid Twitter username")
}
return validations
}
}
现在我们已经设置好了模型,我们可以调用它的 validate()
方法。
let valid = User(mail: "[email protected]", phone: "++3642424242", password: "somepassword", website: nil, twitter: nil)
do { try valid.validate() }
catch {
// Will never be executed because our model is valid.
}
let invalidWebsite = User(mail: "[email protected]", phone: "++3642424242", password: "somepassword", website: "notValidUrl", twitter: nil)
do { try invalidWebsite.validate() }
catch {
print("\(error)") // 'website' isn't nil or isn't a valid url.
}
或者您可以从指定的 keyPath
验证单个字段
try valid.validate(at: \User.mail)
您还可以查看 ValidationsKitDemo
目录中的演示应用程序,使用 Cocoapods 工具。
安装
Cocoapods
只需在您的pods依赖中添加这一行
pod 'ValidationsKit', '~> 1.1'
Swift Package Manager
在您的 Package.swift
中添加GitHub链接作为依赖项
.package(url: "https://github.com/amoriarty/ValidationsKit", from: "1.1.0"),
将依赖项添加到您的目标中
.target(name: "your_target_name", dependencies: ["ValidationsKit"]),
然后使用以下命令更新您的项目:
$ swift package update
与Vapor package的区别
与Vapor package的主要区别在于它不包括Reflectable
系统,这允许您的模型同时符合Decodable
和Reflectable
,以避免在出现错误时输入键路径,如果变量今后被重命名,这种方法可能会导致错误。
感谢
我要非常感谢Vapor社区,感谢他们的所有工作和出色的软件包,这真的是我要带入iOS的一个典范。