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
プロトコルに対して拡張を行っていることです。Int
やUInt
など標準の数値型はBinaryInteger
プロトコルに適合しているため、こうすることで、Int
やUInt
などに個別に拡張を行わなくともまとめて実装できます。
こういう時にプロトコルの偉大さを実感しますね。
@discardableResult
を付けているのは戻り値を利用しない場合に警告を出さないようにするためです。
これがないとResult of operator '++' is unused
みたいな警告が出て鬱陶しいです。
var i = 0
print(i++)
print(++i)
// 0
// 2
これで晴れて、Swiftにインクリメント、デクリメントを復活させることができました。
最後に
復活させておいてなんですが、わざわざ削除された機能なので復活させる必要がないようにも感じます。
何らかの事情でインクリメントを多用している別言語からのSwiftへの移植作業を行う場合には有用かも知れませんが…
追記
コードの自動フォーマッターを利用していると++
や--
がうまく認識されず綺麗にフォーマットできなくなることがあります。
swimatを利用した際は、綺麗にフォーマット出来ませんでした…