LoginSignup
4
1

More than 1 year has passed since last update.

[Swift] 高階関数に利用できる高階関数なnot関数

Last updated at Posted at 2021-04-12

これはなに?

趣味の世界です。

問題

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
)
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1