【Swift3】配列の番号と剰余算と条件演算子?:

先日、友人の書いたSwiftのコードを見ていた。
その中でやっていることは何となく分かるが、どういう演算子(というのか?)を使っているかわからない部分があった。

やっていることは配列を順番に呼び出すため、配列の番号を1ずつ加えていって配列の最後に来たら最初に戻るというのと、
配列の番号を1つづ引いていって最初まで戻ったら最後の番号に移動するという関数です。

配列の変数はstrArray
番号を入れる変数をpositionとして、

自分が普通に考えたら、if文を使って
最初の加えていく関数は、

    func getNextPositionIf() -> (Int) {
        if position + 1 < strArray.count {
            //positionに1を足したものがstrArray.countより小さければ
            return position + 1
            //positionに1を足したものを返す
        }
        return 0
        //positionに1を足したものがstrArray.countと同じか大きければ?0を返す。
    }

こんな感じで書くかな?

それを友人は

    func getNextPosition() -> (Int) {
        return (position + 1) % strArray.count
    }

と書いていた。

調べてみると、「%」は剰余算の演算子です。
x % Y の場合xをyで割った余りが求められます。

例えば、配列strArrayに入っている要素が5つだとすると、配列の番号positionにはいるのは0,1,2,3,4となる。

positionが3の時、次の番号を求められると、(3+1)わる5 は 0あまり4で4が返される。
positionが4の時、次の番号を求められると、(4+1)わる5 で 1あまり0で0が返される。

うーむ非常にスマートに書かれている。(^_^;)

続いて1ずつ引いていく場合自分が書くと、

    func getPrevPositionIf() -> (Int) {
        if position - 1 < 0 {
            //positionから1を引いて0以下になったら
            return strArray.count - 1
            //strArray.countから1引いたものを返す
        }
        return position - 1
        //それ以外はpositionから1引いたものを返す
    }

こんな感じかな?

それを友人は

    func getPrevPosition() -> (Int) {
        return (position == 0 ? strArray.count : position) - 1;
    }

と書いていた。

(; ・`ω・´)
なんだこれ?なんで一行で?

いろいろ調べた結果、
参考サイト
C言語の演算子について

条件演算子と言うものらしい。

a ? b : c aが真ならbが実行、aが偽ならcが実行。

つまりpositionが0であればstrArray.countから1引いたものを返す、
そうでなければpositionから1引いたものを返す

ということでやってることはif文と同じですね。

しかしスマート。

こういう書き方はふつうにC言語とか習ってる人は知ってるのかなあ?

20数年前のBASICから独学でObjective-cに飛んだ私には分からない(;´∀`)

ま、人様のコードを読むのは勉強になりますね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です