У меня есть класс, в котором есть информация о фильтрации данных перед этими данными.Я хочу сохранить предикат фильтрации, чтобы использовать его на следующем этапе, когда будут предоставлены данные.Фильтрующий предикат представляет собой комбинацию других предикатов, и я обнаружил, что будет полезно создать функцию для их объединения по мере необходимости.
func and<T>(_ lth: @escaping (T) -> Bool,
_ rth: @escaping (T) -> Bool) -> (T) -> Bool {
return { o in lth(o) && rth(o) }
}
Пример использования:
func xIsNot(_ x: Int) -> (Int, Int) -> Bool {
return { x1, _ in x != x1 }
}
func yIsNot(_ y: Int) -> (Int, Int) -> Bool {
return { _, y1 in y != y1 }
}
let predicate = someCondition
? and(and(xIsNot(7), xIsNot(8)), yIsNot(9))
: and(xIsNot(2), yIsNot(3))
let points: [(Int, Int)] = ...
let actualPoints = points.filter(predicate)
Работает нормально, но плохо читается.Следующее выглядит намного лучше:
let predicate = someCondition
? xIsNot(7) && xIsNot(8) && yIsNot(9)
: xIsNot(2) && yIsNot(3)
Можно ли переопределить оператор &&
для замены and
?Как?