変数UInt8の値をラップアラウンドさせる

Swiftは型チェックの厳しい言語です。それはコンパイル時だけでなくて、実行時においてもそうです。C言語のように範囲を超えるとラップアラウンドせずに実行時エラーを発生します。

画像処理では符号なし 8bits 深さのデータを扱う場合が多いです。このとき値のとりうる範囲は 0 から 255 です。

多くの場合は バグ回避のために、256 以上になったら 255 にはりつける、0 未満のマイナスの値になったら 0 にはりつける、というシチュエーションですが、ごく稀に、255 の次はラップアラウンドして 0 にしたいときがあります。( アーティスティックな画像処理など見た目の面白さを狙ったもの )

下記のコードは level という変数を UInt8 の初期値 0 で宣言して、インクリメントしていきます。最初のうちは問題ありませんが、level という変数に 256 という値が代入された瞬間に実行時エラーになります。

var level: UInt8 = 0
level = level + 1

これを回避するためには

+

ではなくて

&+

という演算子を利用してインクリメントしてください。

var level: UInt8 = 0
level = level &+ 1

0, 1, 2, 3, ......... 254, 255, 0, 1, 2, 3 ........ 254, 255, 0, 1 ...... のようにラップアラウンドした値が level に代入されます。

+1 の部分は変数にもできますが、UInt8 には UInt8 同士の演算しかできませんので、下記のように let 定義します。

let TICKS: UInt8 = 1
var level: UInt8 = 0
level = level &+ TICKS

ラップアラウンド対応の演算子は、これ以外にも

&-

&*

&<<

&>>

がありますので、みなさんの仕事にあわせてご利用くださいませ。