enumで定義した値を順番に使用したいときがたまにあります。
デフォルトではこれを実現するメソッドが用意されていないため、独自にenumにメソッドを追加します。
enum Fruit: Int {
case Apple = 0
case Orange
case Banana
static let values = [Apple, Orange, Banana]
mutating func next() {
let val = (self.rawValue + 1) % Fruit.values.count
self = Fruit(rawValue: val)!
}
}
このように実装することで、Apple -> Orange -> Banana -> Apple -> ... の順に値を使用できます。
この実装では要素数を取得するために、enumの値一覧をvaluesで定義しています。(Javaではデフォルトで用意されているので、若干不便。。。)
ちなみに、自身の値を変更する操作をしているため、メソッドにmutating修飾子を付与する必要があります。
おまけ
要素数が分かれば良いので、下記のようにenumの値の末尾にcounterを定義する方法でも大丈夫です。
(enumの要素としてcounterが定義されてしまうので微妙な感じですが。)
enum Fruit: Int {
case Apple = 0
case Orange
case Banana
case counter
mutating func next() {
let val = (self.rawValue + 1) % counter
self = Fruit(rawValue: val)!
}
}