Swiftにインクリメント(++)、デクリメント(--)を復活させる

Swift3でインクリメント、デクリメントが削除されました。

しかし、慣れ親しんだインクリメント、デクリメントを使いたい。

そんなわけで、Swift5にインクリメント、デクリメントを復活させます。

インクリメント、デクリメントを復活させる

さて、削除されてしまったインクリメント、デクリメントをどう復活させるかという話ですが、やり方は単純。
Swiftのextensionとカスタム演算子の機能を利用します。

実装

extension BinaryInteger {
    // 前置インクリメント 
    @discardableResult
    static prefix func ++(i: inout Self) -> Self {
        i += 1
        return i
    }
    // 後置インクリメント
    @discardableResult
    static postfix func ++(i: inout Self) -> Self {
        let tmp = i
        i += 1
        return tmp
    }
    // 前置デクリメント
    @discardableResult
    static prefix func --(i: inout Self) -> Self {
        i -= 1
        return i
    }
    // 後置デクリメント
    @discardableResult
    static postfix func --(i: inout Self) -> Self {
        let tmp = i
        i -= 1
        return tmp
    }
}

ポイントはBinaryIntegerプロトコルに対して拡張を行っていることです。
IntUIntなど標準の数値型はBinaryIntegerプロトコルに適合しているため、こうすることで、IntUIntなどに個別に拡張を行わなくともまとめて実装できます。

こういう時にプロトコルの偉大さを実感しますね。

@discardableResultを付けているのは戻り値を利用しない場合に警告を出さないようにするためです。
これがないとResult of operator '++' is unusedみたいな警告が出て鬱陶しいです。

var i = 0
print(i++)
print(++i)

// 0
// 2

これで晴れて、Swiftにインクリメント、デクリメントを復活させることができました。

最後に

復活させておいてなんですが、わざわざ削除された機能なので復活させる必要がないようにも感じます。
何らかの事情でインクリメントを多用している別言語からのSwiftへの移植作業を行う場合には有用かも知れませんが…

追記
コードの自動フォーマッターを利用していると++--がうまく認識されず綺麗にフォーマットできなくなることがあります。
swimatを利用した際は、綺麗にフォーマット出来ませんでした…