0

ObjectUtil.compare() を使用して 2 つの辞書を比較したいと考えています。辞書が同一の場合 (2 つの異なるインスタンスですが、内容は同一)、比較は奇妙な例外で失敗します。

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

わかりやすくするためのコードを次に示します。

メイン.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.compare2 つの辞書を呼び出します。このgetMyDictionary()メソッドは、明らかに新しい同一の辞書を毎回返します (もちろんインスタンスは異なりますが、それらは同一です)。コードが に到達するObjectUtil.compare()と、デバッガーは次のエラーを出力します。

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

「oranges」キーを QName と比較する必要があるのはなぜですか?

注:ObjectUtil.compare同じインスタンスを引数として指定して呼び出すと、正しく機能します。getMyDictionary()の戻り値を変数に保存してmyDict呼び出すとObjectUtil.compare(myDict, myDict)、エラーは表示されず、比較はパスします。

誰でも光を当てることができますか?私はそれを間違っていますか?

4

2 に答える 2

1

これは Flex SDK のバグです。以外のキー タイプを使用しない場合は、Object代わりに使用します。DictionaryString

private function getMyDictionary() : Object {
      var myDictionary : Object = new Object();
      myDictionary["oranges"] = "orange";
      myDictionary["kiwis"] = "green";
      return myDictionary;
}
于 2012-04-18T11:36:23.820 に答える
0

ドキュメントを調べたところ、これが見つかりました。これは役立つかもしれません

mx.utils.ObjectUtil.compare(a:オブジェクト、b:オブジェクト、深さ:int=-1):int

オブジェクトを比較し、最初の項目が 2 番目の項目より小さいか等しいかどうかを示す整数値を返します。このメソッドは、ネストされたオブジェクトのプロパティを再帰的に比較し、ゼロ以外の結果が見つかるとすぐに戻ります。デフォルトでは、このメソッドはプロパティの最も深いレベルまで再帰します。比較のために深さを変更するには、深さパラメータに負でない値を指定します。パラメータ: オブジェクト。b オブジェクト。depth 比較を実行するときに再帰する必要があるレベルの数を示します。各プロパティのプリミティブ表現のみを浅く比較するには、この値を 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 または b より大きい場合は 1 を返します。b が null または a より大きい場合は -1 を返します。

言語バージョン: 3.0

プレーヤーのバージョン:Flash 9、AIR 1.1

製品バージョン:Flex 3

于 2012-04-20T13:44:34.150 に答える