3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Haxeはswitch文が便利

Last updated at Posted at 2013-02-12

Haxeの通常のswitch文は以下のようになります。

var colorName = "";
var num = switch( colorName ) {
	case "red", "":		0xFF0000;
	case "green", "":	0x00FF00;
	case "blue", "":		0x0000FF;
	case "うぐいす":		0x928C36;
	default:
		throw "そんな色知らないよ!";
}

「break;」がない、caseが複数指定出来る、値を返すというのが特徴です。
これだけでも便利なんですがさらに便利なのはEnum(列挙型)を使った時です。


#Enumとは
Enumは、AS3でいうところのイベント定数やキーコード定数のような実装を行うときに使われるデータ型です。

以下のように使います。

Main.hx
enum Keyboard {
	UP;
	DOWN;
	LEFT;
	RIGHT;
	Number( num:Int );
	Alphabet( charString:String );
}

class Main {
	static function main() {
		getKeyCode( Keyboard.UP );				//38
		getKeyCode( Keyboard.Alphabet( "A" ) );	//65
		getKeyCode( Keyboard.Alphabet( "z" ) );	//90
		getKeyCode( Keyboard.Number( 1 ) );		//49
	}
	
	static function getKeyCode( key:Keyboard ) {
		switch( key ) {
			case LEFT:
				return 37;
				
			case UP:
				return 38;
			
			case RIGHT:
				return 39;
				
			case DOWN:
				return 40;
				
			case Alphabet( char ):
				if ( char.length != 1 ) throw "charStringの長さは1でなければなりません";
				char = char.toUpperCase();
				var code = char.charCodeAt( 0 );
				if ( code < 65 || 90 < code ) throw "文字列がアルファベットじゃありません";
				return code;
				
			case Number( n ):
				if ( n < 0 || 9 < n ) throw "0~9を指定してください";
				return n + 48;
		}
	}
}

HaxeのEnumは変数を指定できるのが特徴で、これをswitch文により取りだすことができます。

Enumに複数の変数を指定することも可能です。

enum Sample {
	TEST( i:Int, s:String );
}

追記:
Haxe3になって、switch文はさらに便利になりました。
詳しくは、パターンマッチング - Haxe

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?