変数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
ラップアラウンド対応の演算子は、これ以外にも
&-
&*
&<<
&>>
がありますので、みなさんの仕事にあわせてご利用くださいませ。