これはなに?
趣味の世界です。
問題
Arrayをfilterする時に使用するFilter用の関数を用意しています。
func isValid(_ i: Int) -> Bool {
i > 0 && i <= 100 || i > 1000
}
これでvalidな要素のみの配列が取得可能です。
let validItems = array.filter(isValid)
このとき同時にvalidではない要素も取得したいとします。普通に書けばこうなります。
let invalidItems = array.filter { !isValid($0) }
対称性が崩れて見えて気持ち悪いですね。
解決策
問題を解決するために not関数を用意します。
func not<T>(_ condition: @escaping (T) -> Bool) -> (T) -> Bool {
{ !condition($0) }
}
これを利用すると、validではない要素の取得はこうなります。
let invalidItems = array.filter(not(isValid))
対称性が保たれましたね。
おまけ
この not関数はこのままで2変数関数(多変数関数)に対して利用可能です。
またオペレータも関数の一種ですので利用可能です。
let a = (0..<100).shuffled()
print(
zip(0..., a)
.filter(not(==)) // OK
)