Swift3にてCライクなfor文と ++, -- 演算子が廃止

私はまだぎりぎり Xcode 7.2 を使っているが、Xcode 7.3 から Swift のバージョンが 3.0 に上がるそうな。

【参考:Swift 3.0の変更点まとめ】
http://dev.classmethod.jp/smartphone/iphone/implemented_proposals_for_swift3/

Appleとかいう企業は、まるでナニカ(それはおそらくJではじまる)に取り憑かれたかのように「イノベーション」という言葉を使いたがり、こうした下位互換を無視した思い切った仕様変更的なことを、わりとよくやってる気がする。


っと見で私が気になったのは、

「++ -- 演算子を削除」
C-Styleのfor文の削除」

である。

「ふーん」という感じだったが、少し考えてみて、どうしてそんなことをするんだろうと疑問に思った。
慣れ親しんだ構文だし、わざわざ廃止する必要があるのか? と。

しかし、よくよく考えてみるとやがてこれは合理的な判断だと思えてきた。



ず、インクリメントとデクリメント演算子について、
C, C++, Javaなどの経験があるならば、これらを知っていて当然だが、Swiftを最初のプログラミング言語として学ぶ人にとっては、こいつらの存在は、微量ながらも学習コストを増加させることになる。

言うまでもなく、x++x += 1 に置き換えることができる。1しか足したり引いたりできないよりも、より汎用的な後者の記法だけを知っていればよい、という考え方ができなくもない。


に、インクリメントやデクリメント演算子の存在によって、

x++ - --x

このようなトリッキーな記述が命令文として有効になってしまう。

もちろん、読みにくい。

一応解説しておくと、上記式の演算結果は 0 となり、x は初期値と同じ値をとる。

仮に、x の初期値を 0 とする。

  1. 左辺の x の値が評価される → この時点で 0 - --x
  2. x がインクリメントされる → x == 1
  3. 右辺の x がデクリメントされる → x == 0
  4. 0 - 0 が計算される

よって、式の評価値は 0, 評価後の x の値も 0 である。

いかにも、C, C++未経験者がこんなトリッキーなことを容易に理解できるはずがない。先ほど、「微量ながらも学習コストを増加させる」と言ったが、これは微量ではないかもしれない。


えて、

x++;

x += 1;

に対して、それほど短くもない。

しかも、Swiftでは、x ++ のように、変数と演算子の間に空白を入れることも許されないので、自由が利くわけでもなく、これでは自分なりの読みやすさを追求することもできない。



ならば、ゆえに、「++, -- なんて演算子はない方がよい」ということだ。



方で、現状、どのような場面で ++, -- 演算子を使うかというと、それは多くの場合、

for var i = 0; i < n; i++ {}

のようなCライクなfor文においてであるが、この構文自体、Swift 3 では削除される。

Swift では、より簡潔な for in 構文を使うことができる。

for i in 0..<n {}

(ちなみにカウンターが不要な全件走査の場合はforEachの方を使うので、for in自体もわりと限定的ではある)

ということで、こいつらはそれほど恩恵もないし、より良い書き方に統一するためにも、全部まとめて削除しましょうということだと理解した。


まあ、納得…かな。



【参考】
http://stackoverflow.com/questions/35158422/the-and-operators-have-been-deprecated-xcode-7-3