2016-08-24 2 views
1

Int64にプリミティブIntタイプを設定すると問題なく動作します。私はさらに、補足クラス___Int64のコンストラクタメソッドをキャッチして、Intという2つの値を受け入れることもできます。このキャスティングは静的であっても、そのようなコードは完璧に動作しているようです:haxe:抽象的なInt64に整数をキャストする

var short:Int = 1111; 
var long:Int64 = 2222; 
long = short; 
trace(long.high, long.low); // =0,1111 

しかし、私は次のようopenfl.utils.Objectインスタンスのフィールドから値を設定してい:

var id:Int64 = data["id"]; 

"id"フィールドの値どちらかIntまたはInt64は - 私は、フィールドの型をチェックし、適切からInt64をインスタンス化することができますもちろん、エラーTypeError: Error #1034: Type Coercion failed: cannot convert 1111 to haxe._Int64.___Int64.

を持っています。しかし、タイプキャスティングを自動化するためのすっきりしたソリューションはありますか?

答えて

2

implicit castsからimplicit castsまでDynamic(戻り値はopenfl.utils.Objectの配列アクセスget)を使用してチェックアウトを抽象化することができます。

abstract AnyInt64(Int64) from Int64 to Int64 { 
    @:from static function fromDynamic(d:Dynamic):AnyInt64 { 
     if (Std.is(d, Int)) 
      return Int64.ofInt(cast d); 
     if (Int64.is(d)) { 
      var i:Int64 = cast d; 
      return i; 
     } 
     throw "conversion error"; 
    } 
} 

は使用方法:(あなたが唯一のそれらの2種類を使用しない限り)

var data = new openfl.utils.Object(); 

data["int"] = 500; 
var id:AnyInt64 = data["int"]; 

data["int64"] = Int64.make(1, 0); 
var id2:AnyInt64 = data["int64"]; 

あなたはIntInt64いえません未遂の変換に対処するための良い方法を見つける必要があります。 Null<Int64>を基にするタイプをAnyInt64 + nullにチェックしてください。

+0

JSONで大きな数値を持つオブジェクトを作成するときに、一般的な型であるFloatからの変換を追加しました。 – meps

関連する問題