2016-08-24 3 views
1

Lorsque je configure le type Int primitif sur Int64, cela fonctionne correctement. Je peux même attraper une méthode constructeur dans la classe supplémentaire ___Int64 qui accepte deux valeursInt - haute et basse. Il semble que cette coulée est statique et même ce code fonctionne parfaitement:haxe: Conversion des entiers en abstract Int64

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

Mais quand je suis la mise en place valeur d'un champ de openfl.utils.Object exemple comme:

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

où la valeur du champ "id" soit Int ou Int64 - J'ai une erreur TypeError: Error #1034: Type Coercion failed: cannot convert 1111 to haxe._Int64.___Int64.

Bien sûr, je peux vérifier le type de terrain et bien instancier un Int64 de Int. Mais existe-t-il une solution soignée pour automatiser le moulage de type?

Répondre

2

Vous pouvez utiliser un abstract type avec implicit casts de Dynamic (la valeur de retour de l'accès réseau de openfl.utils.Object get) à l'abstrait le chèque loin.

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"; 
    } 
} 

Utilisation:

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"]; 

Vous devez trouver un bon moyen de faire face à des conversions de tentatives qui ne sont pas Int ou Int64 bien (sauf si vous utilisez uniquement ces deux types). L'utilisation de Null<Int64> comme type sous-jacent pour AnyInt64 + vérification de null peut fonctionner.

+0

J'ai ajouté la conversion de 'Float' car il est de type commun lors de la création d'objets avec de grands nombres par JSON. – meps