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 とする。
- 左辺の x の値が評価される → この時点で
0 - --x
- x がインクリメントされる →
x == 1
- 右辺の x がデクリメントされる →
x == 0
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