【问题标题】:Casting Int to Int64 in Haxe在 Haxe 中将 Int 转换为 Int64
【发布时间】:2016-08-24 20:16:10
【问题描述】:

当我将原始 Int 类型设置为 Int64 时,它工作正常。我什至可以在补充类___Int64 中捕获一个构造方法,它接受两个 Int 值——高和低。似乎这种转换是静态的,甚至这样的代码也能完美运行:

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" 字段的值是 IntInt64 -- 我有一个错误:

TypeError:错误 #1034:类型强制失败:无法将 1111 转换为 haxe._Int64.___Int64。

当然,我可以检查字段的类型并正确地从Int 实例化一个Int64。但是有没有一种巧妙的解决方案来自动化类型转换?

【问题讨论】:

    标签: casting haxe openfl int64


    【解决方案1】:

    您可以使用abstract type 和来自Dynamicimplicit castsopenfl.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";
        }
    }
    

    用法:

    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 可能会起作用。

    【讨论】:

    • 我添加了来自Float的转换,因为它是通过JSON创建大数字对象时的常见类型。
    猜你喜欢
    • 2011-05-02
    • 2016-12-09
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    相关资源
    最近更新 更多