JavaScript
Swift
インクリメント
swift3
デクリメント

web制作者にもわかる、Swift 3が++と--を削除した理由

More than 1 year has passed since last update.

JavaScriptやC等の言語の経験があれば、変数の値を1増やすインクリメント(++)、1減らすデクリメント(--)を使ったことがあるでしょう。しかし、macOSやiOS用アプリ開発言語Swiftのバージョン3からはこの2つの演算子は削除されました

本エントリーでは、Swift 3からインクリメントとデクリメントが削除された理由を人気のスクリプトJavaScriptと比較しつつ紹介します。


インクリメントとデクリメントは紛らわしい

++--は、似たような紛らわしい使い方があります。JavaScriptを例にして考えてみましょう。

次の処理においてconsole.log(a)部分では何が出力されるでしょうか?

let x = 1;

let a = ++x;
console.log(a);

答えは2です。++xと記述すると、変数xに1を足した後の結果が返ります(プリインクリメント)。

では、次の処理ではconsole.log(a)部分では何が出力されるでしょうか?

let x = 1;

let a = x++;
console.log(a);

答えは1です。x++と記述すると、変数x1を足す前の値のコピーが返ります(ポストインクリメント)。

同様に、--についても、プリデクリメント(--x)とポストデクリメント(x--)があります。

この使い分け、紛らわしくないですか?


インクリメント・デクリメントのデメリット

インクリメント・デクリメントには、いくつかのデメリットがあります。


1. 学習コスト

ポストインクリメント、プレインクリメントの使い分けは、プログラミングを初めて学ぶ人にとっては高い学習コストになります。


2. そんなに短くない

++--は一見短くコードを書けそうですが、似た表現をするx+=1も同じくらい短いものです。


3. 混乱を招きやすい

++--を用いたコードは、前述のように紛らわしい計算結果であり、他の開発者にとっては混乱を招き、危険です。


Swift 3では++--が削除された

Swiftにおいても開発当初はインクリメント、デクリメントが実装されていましたが、それは他の言語でも実装されていたからという理由に過ぎず、議論が充分になされていませんでした。Swift 3では前述のデメリットを踏まえインクリメントとデクリメントが削除されました

次に示すのは、Swift 3で++を使おうとしている例です(Xcode 8.2のPlayground) 。

image

'++' is unavailable: it has been removed in Swift 3 というエラーが表示され、++が使えないことがわかります。


for文はどうなるのか

気になるのはfor文で使用している++です。Swift 3以前では、for文は次のように記述していました。

for var i = 0; i < 10; i++ {

// 処理
}

i++の部分が使用不可能ですので、次のように記述します(※)。

for i in 0..<10 {

// 処理
}

0..<10の部分はJavaScriptでは見慣れないかもしれませんが、0, 1, 2, ... 9を表す範囲演算子というもので、Swiftでは3以前から使用できる一般的な演算子です。このように、Swift 3では++--を用いずとも可能な処理体系が実装済です。


最後に

インクリメント(++)とデクリメント(--)というプログラマーなら誰でも知っている演算子を削除したSwift 3。要約すれば、「++--は紛らわしいし、そんなにメリットも無いから削除したよ」ということです

プレインクリメント、ポストインクリメントの問題があることや、両演算子を使わない代替手段があることを考えれば、個人的には賛同できるアップデートです。

Swiftは、既存のプログラミング言語を見直し、都度モダンな概念を取り入れています。学んでみると、現在自分が使っている言語の特性も見えてくるのでお勧めです。

参考記事:swift-evolution 「Remove the ++ and -- operators」