Quiver
Quiver 是一个库,提供了一种验证、搜索和过滤对象的简单方法。
安装
CocoaPods
pod 'Quiver', '~> 1.2'
Carthage
github "heitorgcosta/Quiver" ~> 1.2
用法
验证
可以通过实现 Validatable
协议来轻松验证对象。为此,必须实现 validations(with:)
。映射使用 Swift 4 的新智能键路径。
struct Person {
var name: String?
var age: Int?
}
extension Person: Validatable {
func validations(with mapper: ValidatorMapper) {
// Name is required and must be at least 4 characters long.
mapper[\Person.name] = [.required(),
.length(min: 4)]
// Age is required and must be 18 or over
mapper[\Person.age] = [.required(),
.greaterOrEqual(to: 18)]
}
}
任何实现 Validatable
的对象都可以调用 validate()
,这将返回一个结果对象。
let person = Person(name: "Hector", age: 23)
let result = person.validate()
print(result.success) // Prints 'true'
结果还包括发生的错误。
let person = Person(name: "Hector", age: nil)
let result = person.validate()
print(result.success) // Prints 'false'
print(result.error.items.count) // Prints 1, since it does not fulfill the 'required' validation
此外,每个验证器可以包含您定义的自定义消息。
extension Person: Validatable {
func validations(with mapper: ValidatorMapper) {
mapper[\Person.name] = [.required(message: "The name is required"),
.length(min: 4, message: "The name should be at least 4 characters long")]
mapper[\Person.age] = [.required(message: "The age is required"),
.greaterOrEqual(to: 18, message: "The age should be 18 or over")]
}
}
let person = Person(name: "Heitor", age: 17)
let result = person.validate()
print(result.error.firstItem?.message ?? "No errors found") // Will print 'The age should be 18 or over'
验证器仍处于起步阶段,未来还将添加更多。
搜索
首先,要搜索的对象必须实现 Searchable
协议。函数 searchableFields()
应返回所有可搜索属性。
struct Person {
var name: String
var age: Int
}
extension Person: Searchable {
func searchableFields() -> [Any?] {
return [name, age]
}
}
然后,任何此类对象的数组都可以使用 search()
函数获取匹配结果的数组。
// If any searchable field of a person contains "John", it is returned in the result array.
let results = personsArray.search(with: "John") // Search is not case sensitive by default.
let caseSensitiveResults = personsArray.search(with: "John", caseSensitive: true) // Explicit case sensitivity
过滤
可以使用本库中包含的验证器通过使用 filter(by:with:)
对象数组进行过滤,使用键路径和验证器数组。
let persons: [Person] = [] // Just imagine a great collection of persons
let filtered = persons.filter(by: \Person.name, with: [.length(min: 4)]) // Filter persons that contains name with length of at least 4 characters
许可
Quiver 在 MIT 许可证 下发布。