LoginSignup
4
4

More than 5 years have passed since last update.

「要素が範囲に含まれる」という演算子を作ってみた

Last updated at Posted at 2015-11-27

まあ割とありますよね?例えば let a = 1 があって、a >= 0 && a < 10 という判断をやりたい時。

C 言語や Objective-C の時は本当にそういう演算子がなくて、いちいち律儀に a >= 0 && a < 10 で書くしかなかったけど、Swift になって一応 ~= という演算子が出てきました。これで「この範囲内にこの要素がある」という判断が割と簡単に書けるようになりました:

let a = 1
0 ..< 10 ~= a // true

でも、いやいや、待ってよ、この書き方ってめちゃくちゃ分かりづらくね?分かりづらいというかなんか癖があるんじゃね?だって話す時って「この要素はこの範囲内にある」って言うじゃん?上の数式も変数が左にあるじゃん?それに数学だって「a ∊ A」って書くじゃん?どう考えても要素の方が範囲より先にくるはずじゃん?なんでここだけ範囲の方を先に書かなくちゃいけないの?これはただ単に英語で言う「contains」の意味になってるだけじゃん?

というわけで、わかりやすいように、数学でいうこの「∊」って演算子を作ってみたいと思います:

infix operator  {}

func  <T where T: Comparable> (lhs: T, rhs: HalfOpenInterval<T>) -> Bool {
    if lhs >= rhs.start && lhs < rhs.end {
        return true
    } else {
        return false
    }
}

func  <T where T: Comparable> (lhs: T, rhs: ClosedInterval<T>) -> Bool {
    if lhs >= rhs.start && lhs <= rhs.end {
        return true
    } else {
        return false
    }
}

そして、使うときは数学の時と同じように:

let a = 1
a  0 ..< 10 //true

のように使えばいいです。

でもこのままではちょっと使いづらいところありますね、だって「∊」って記号普通のキーボードじゃあ一発で出てこないもん。
というわけで、いろいろ探してみましたが、 の代わりに …= を使うことにしました。「…」は普通の Mac の US キーボードなら「opt + ;」で出てきますのでまあまあ打ちやすいです(JIS キーボードは手元にないのでわかりませんが…)。上記のソースコードのところの「∊」を全て「…=」に置き換えればそのまま使えますので、皆さんも自分のわかりやすい記号で演算子を定義してみれば良いのではないかと思います。

あとここでは HalfOpenIntervalClosedInterval だけしか定義していませんが、もし必要なら Range も入れてもいいかもしれません。自分はそれやりたくないが。

4
4
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
4