Flex:比较两个相同的字典与ObjectUtil失败?

时间:2012-04-18 09:17:23

标签: actionscript-3 flex dictionary mxml

我想使用ObjectUtil.compare()比较两个词典。当字典相同时(两个不同的实例,但内容相同),比较失败并出现一个奇怪的例外:

Error #1034: Type Coercion failed: cannot convert "some_key" to QName.

这里有一些代码可以让它更清晰。

Main.mxml

<?xml version="1.0" encoding="utf-8"?>
<local:MainTest xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:local="*"/>

MainTest.as

package {
  import spark.components.Application;
  import flash.utils.Dictionary;
  import mx.utils.ObjectUtil;

  public class MainTest extends Application {
    public function MainTest() {
      super();
      trace(ObjectUtil.compare(getMyDictionary(), getMyDictionary()));
    }

    private function getMyDictionary() : Dictionary {
      var myDictionary : Dictionary = new Dictionary();
      myDictionary["oranges"] = "orange";
      myDictionary["kiwis"] = "green";
      return myDictionary;
    }
  }
}

如您所见,构造函数使用两个词典调用ObjectUtil.comparegetMyDictionary()方法显然每次返回新的,相同的词典(当然,不同的实例,但它们是相同的)。当代码到达ObjectUtil.compare()时,调试器会输出以下错误:

Error #1034: Type Coercion failed: cannot convert "oranges" to QName.

为什么要将“oranges”键与QName进行比较?

注意:如果我调用ObjectUtil.compare给出与参数相同的实例,它就可以正常工作。我的意思是,如果我将getMyDictionary()的返回值保存到变量myDict并调用ObjectUtil.compare(myDict, myDict),则错误将不会出现,并且比较将会通过。

任何人都能解开一些光明吗?我做错了吗?

2 个答案:

答案 0 :(得分:1)

这是Flex sdk中的一个错误。 如果您不打算使用Object以外的任何密钥类型,请使用Dictionary代替String

private function getMyDictionary() : Object {
      var myDictionary : Object = new Object();
      myDictionary["oranges"] = "orange";
      myDictionary["kiwis"] = "green";
      return myDictionary;
}

答案 1 :(得分:0)

通过我发现的文档后,可能会有所帮助

  

mx.utils.ObjectUtil.compare(a:Object,b:Object,depth:int = -1):int

     

比较对象并返回一个整数值,指示是否   第一项小于或等于第二项。这个   方法将递归地比较嵌套对象的属性和意志   一旦找到非零结果就返回。默认情况下这种方法   将递归至任何财产的最深层次。改变深度   为比较指定深度参数的非负值。   参数:一个对象。 b对象。 depth指示应该有多少级别   在执行比较时被递归。为a设置此值为0   浅比较每个的原始表示   属性。

     

例如:

   var a:Object = {name:"Bob", info:[1,2,3]};
   var b:Object = {name:"Alice", info:[5,6,7]};
   var c:int = ObjectUtil.compare(a, b, 0);
  

在上面的例子中,a和b的复杂属性将是   在进行比较时通过调用toString()来展平。在这   如果执行时,info属性将变为字符串   比较。

     

返回:

     

如果a和b为null,NaN或相等,则返回0。如果a为null,则返回1   或大于b。如果b为null或大于a。

,则返回-1      

语言版本:3.0

     

播放器版本:Flash 9,AIR 1.1

     

产品版本:Flex 3