Как переопределить оператор и (&&) для общего предиката в swift? - PullRequest
0 голосов
/ 29 марта 2019

У меня есть класс, в котором есть информация о фильтрации данных перед этими данными.Я хочу сохранить предикат фильтрации, чтобы использовать его на следующем этапе, когда будут предоставлены данные.Фильтрующий предикат представляет собой комбинацию других предикатов, и я обнаружил, что будет полезно создать функцию для их объединения по мере необходимости.

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?Как?

1 Ответ

2 голосов
/ 29 марта 2019

Вы можете попробовать это:

infix operator &&& : AdditionPrecedence
func &&&<T>(_ lth: @escaping (T) -> Bool,
        _ rth: @escaping (T) -> Bool) -> (T) -> Bool {
return { x in lth(x) && rth(x) }
}

let predicate = true
? xIsNot(7) &&& xIsNot(8) &&& yIsNot(9)
: xIsNot(2) &&& yIsNot(3)

let points: [(Int, Int)] = [(1,2),(7,3)]
let actualPoints = points.filter(predicate)

Следующее && также работает.

infix operator && : AdditionPrecedence
func &&<T>(_ lth: @escaping (T) -> Bool,
        _ rth: @escaping (T) -> Bool) -> (T) -> Bool {
return { x in lth(x) && rth(x) }
}

let predicate = true
? xIsNot(7) && xIsNot(8) && yIsNot(9)
: xIsNot(2) && yIsNot(3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...