1 post tagged

predicate

Предикат

Предикат – это логический оператор, который сравнивает два выражения с помощью специального синтаксического анализатора (Тут можно детальнее почитать о синтаксе предиката). Когда приходится работать со строками, сложной выборкой и регулярными выражениями, то предикат – незаменимая штука. Для себя я написал два оператора, которые представляют простенький шаблон для использования предиката, вот как он выглядит:

Выражение предиката |*| Шаблон <=> Проверяемое значение

Первый оператор – это каррированая функция, которая собственно и создает предикат

infix operator |*| { associativity left}
func |*| <T: AnyObject> (pattern: String, b: T) -> (T) -> Bool {
    return { (a: T) -> (Bool) in
        return NSPredicate(format:pattern, argumentArray:[b]).evaluateWithObject(a)
    }
}

Второй оператор – функция, которая заменит скобки на <=>

infix operator <=> { associativity left }
func <=> <A, B>(f: A -> B, g: A) -> B {
    return f(g)
}

Примеры использования:

"SELF MATCHES %@" |*| "([0-9])\\w+" <=> "345"
// => true
"SELF == %@" |*| 3 <=> 4
// => false
"SELF CONTAINS %@" |*| "c" <=> "abc"
// => true

с фильтром:

struct User {
    let name: String
}

let users = [User(name: "text"), User(name: "787")]

users.filter({ "SELF MATCHES %@" |*| "([0-9])\\w+" <=> $0.name })
// => User(name: "787")
2016   predicate