ベクターの操作

Adobe AIR 1.5 およびそれ以降

Vector インスタンスは、 型指定配列です。 つまり、Vector インスタンスのすべての要素は必ず同一のデータ型を含みます。NativeProcess や NetworkInfo などの一部の AIR API はプロパティまたはメソッドのデータ型として Vector を使用します。

Adobe AIR で実行している JavaScript コードでは、Vector クラスは air.Vector(AIRAliases.js ファイル内)として参照されます。

ベクターの基礎

Vector 変数を宣言するか、または Vector オブジェクトをインスタンス化するときは、ベクターが含むことのできるオブジェクトのデータ型を明示的に指定します。指定したデータ型は、ベクターの ベース型 と呼ばれます。実行時に、ベクターの値を設定または取得するすべてのコードが検証されます。追加または取得されるオブジェクトのデータ型がベクターのベース型と一致しない場合は、エラーが発生します。

データ型の制限に加えて、Vector クラスには Array クラスと区別される次のようなその他の制限があります。

  • ベクターは高密度の配列です。Array オブジェクトは、位置 1 ~ 6 に値を含まない場合でも、インデックス 0 および 7 に値を含む場合があります。ただし、ベクターはインデックスに値(つまり、 null )を含む必要があります。

  • オプションでベクターを固定長にすることができます。固定長の場合、ベクターが含む要素数を変更することはできません。

  • Vector の要素へのアクセスは範囲チェックが行われます。最後の要素( length - 1)より長いインデックスから値を読み取ることはできません。現在の最後のインデックスを越えて値を設定することはできません(つまり、既存のインデックスまたはインデックス [length] でのみ値を設定することができます)。

このような制限の結果として、Vector インスタンスには、エレメントがすべて単一クラスのインスタンスとなる Array インスタンスにはない、次の 3 つの主要な利点があります。

  • パフォーマンス: Array インスタンスを使用するよりも、Vector インスタンスを使用する方が、配列要素のアクセスと繰り返しが高速になります。

  • 型の安全性:このようなエラーの例としては、ベクターに不正なデータ型の値を割り当てたり、ベクターから値を読み取るときに誤ったデータ型を要求したりすることが挙げられます。実行時には、Vector オブジェクトにデータを追加するときや、このオブジェクトからデータを読み取るときにデータ型が検証されます。

  • 信頼性:実行時に範囲を検証(または固定長を検証)することにより、配列よりも信頼性が大幅に向上します。

これらの追加の制限および利点以外では、Vector クラスは Array クラスに非常によく似ています。Vector オブジェクトのプロパティとメソッドは、配列のプロパティとメソッドと似ており、通常は同じです。多くの場合、すべての要素が同じデータ型を持つ配列を使用するときは、Vector インスタンスが推奨されます。

重要な概念と用語

次の参照リストに、配列およびベクター処理ルーチンのプログラミングで使用される重要な用語を示します。

配列アクセス([])演算子
配列要素を一意に識別するインデックスまたはキーを囲む一組の角括弧。このシンタックスはベクター変数名の後に使用され、ベクター全体ではなくベクターの 1 つの要素を指定します。

ベース型
Vector インスタンスを格納できるオブジェクトのデータ型。

エレメント
ベクターの 1 つのアイテム。

索引
インデックス配列内の単一の要素を識別するための「番号アドレス」。

T
ベース型が何であるかに関係なく、Vector インスタンスのベース型を表すこのマニュアルで使用する標準の表記規則。T 表記規則は、型パラメーターの説明に示すように、クラス名を表すために使用されます(「T」は「データ型」の「型」を表します)。

型パラメーター
Vector クラス名で使用され、ベクターのベース型を指定するシンタックス(Vector クラスが格納するオブジェクトのデータ型)。シンタックスは、ピリオド( . )とその後に続く山括弧( <> )で囲まれたデータ型名で構成されます。これらをまとめると、 Vector.<T> のようになります。本マニュアルでは、型パラメーターで指定されるクラスは、通常、 T として表されます。

Vector
すべての要素が同じデータ型のインスタンスである配列の型。

ベクターの作成

air.Vector["<T>"]() コンストラクターを呼び出して Vector インスタンスを作成します。このコンストラクターを呼び出すときに、Vector 変数のベース型を指定します。ベクターのベース型は、型パラメーターシンタックスを使用して指定します。コードでは、 Vector という語の直後に型パラメーターが置かれます。型パラメーターは左角括弧、山括弧( <> )で囲まれた基本クラス名の文字列、右角括弧の順に構成されます。このシンタックスの例は次のとおりです。

var v = new air.Vector["<String>"]();

この例では、変数 v は String オブジェクトのベクターとして宣言されています。つまり、これは、String インスタンスのみを保持できるインデックス配列を表します。

引数を指定しないで air.Vector["<T>"]() コンストラクターを使用すると、空の Vector インスタンスが作成されます。ベクターの length プロパティを検証することによって、Vector が空であることをテストできます。例えば、次のコードは、 Vector["<T>"]() コンストラクターを引数なしで呼び出しています。

var names = new air.Vector["<String>"](); 
air.trace(names.length); // output: 0

ベクターが最初に必要とする要素の数を事前に把握している場合、ベクター内の要素数を事前に定義できます。特定の数の要素を含むベクターを作成するには、1 番目のパラメーター( length パラメーター)として要素数を渡します。Vector 要素は空にできないので、要素にはベース型のインスタンスが入力されます。ベース型が null 値を許可する参照型である場合、すべての要素は null を含みます。その他の場合、要素はすべてクラスのデフォルト値を含みます。例えば、Number 変数は null にできません。その結果、次のコードでは、3 つの要素を含みそれぞれの要素のデフォルトの Numbe の値が NaN である ages というベクターが作成されます。

var ages = new air.Vector["<Number>"](3); 
air.trace(ages); // output: NaN, NaN, NaN

Vector["<T>"]() コンストラクターを使用すると、第 2 パラメーター( fixed パラメーター)に true を渡すことによって固定長のベクターを作成することもできます。この場合、指定の数の要素を含むベクターが作成され、要素数は変更できません。ただし、固定長のベクターの要素の値を変更することはできます。

AIR ランタイムオブジェクト( window.runtime オブジェクトで定義されたクラス)のベクターを作成する場合、Vector コンストラクターを呼び出すときに ActionScript 3.0 のクラスの完全修飾名を参照します。例えば、次に示すコードは File オブジェクトのベクターを作成します。

var files = new air.Vector["flash.filesystem.File"](3);

ベクターへの要素の挿入

ベクターに要素を追加する最も基本的な方法は、配列アクセス( [] )演算子を使用することです。

songTitles[5] = "Happy Birthday";

Vector にまだそのインデックスの要素がない場合は、インデックスが作成され、そこに値が格納されます。

Vector オブジェクトでは、既存のインデックスまたは次に使用可能なインデックスにのみ値を割り当てることができます。次に使用可能なインデックスは、Vector オブジェクトの length プロパティに相当します。Vector オブジェクトに新しい要素を追加する最も安全な方法は、次のようなコードを使用する方法です。

myVector[myVector.length] = valueToAdd;

配列と同様に、Vector クラスの push() unshift() splice() の3 つのメソッドを使用して、ベクターに要素を挿入することができます。

注意: Vector オブジェクトの fixed プロパティが true である場合は、ベクターの要素数の合計を変更することはできません。 push() メソッドまたは他の方法で固定長のベクターに新しい要素を追加しようとすると、エラーが発生します。

値の取得とベクター要素の削除

ベクターから要素の値を取得する最も単純な方法は、配列アクセス( [] )演算子を使用する方法です。ベクター要素の値を取得するには、代入ステートメントの右側に Vector オブジェクトの名前とインデックス番号を使用します。

var myFavoriteSong = songTitles[3];

要素を含まないインデックスを使用して、ベクターから値の取得を試みることは可能です。その場合、ベクターは RangeError の例外をスローします。

要素を削除する場合は、Array および Vector クラスにある pop() shift() 、および splice() の 3 つのメソッドを使用できます。

var vegetables = new air.Vector["<String>"]; 
vegetables.push("spinach"); 
vegetables.push("green pepper"); 
vegetables.push("cilantro"); 
vegetables.push("onion"); 
var spliced = vegetables.splice(2, 2); 
air.trace(spliced); // output: spinach,green pepper

length プロパティを使用してベクターを切り詰めることができます。

ベクターの length プロパティをベクターの現在の長さ未満に設定すると、ベクターは切り詰められます。 length から 1 を引いた新しい値よりも大きいインデックス番号に格納されているすべての要素は削除されます。

注意: Vector オブジェクトの fixed プロパティが true である場合は、ベクターの要素数の合計を変更することはできません。ここで説明したテクニックを使用して固定長のベクターから要素を削除したり、固定長のベクターを切り詰めたりしようとすると、エラーが発生します。

Vector オブジェクトのプロパティとメソッド

Array オブジェクトの同一のメソッドとプロパティの多くはVector オブジェクトに使用できます。例えば、 reverse() メソッドを呼び出してベクターの要素順を変更することができます。また、 sort() メソッドを呼び出してベクターの要素を並べ替えることができます。ただし、Vector クラスには、 sortOn() メソッドはありません。

サポートされているプロパティとメソッドについて詳しくは、『HTML 開発者用 Adobe AIR API リファレンスガイド』の Vector クラスのドキュメントを参照してください。

ベクターを必要とする AIR API の使用例

一部の Adobe AIR ランタイムクラスは、プロパティまたはメソッドの戻り値としてベクターを使用します。例えば、NetworkInfo クラスの findInterfaces() メソッドは、NetworkInterface オブジェクトの配列を返します。 arguments プロパティの NativeProcessStartupInfo クラスは文字列のベクターです。

Vector オブジェクトを返す AIR API へのアクセス

NetworkInfo クラスの findInterfaces() メソッドは、NetworkInterface オブジェクトの配列を返します。例えば、次のコードはコンピューターのネットワークインターフェイスの一覧です。

var netInfo = air.NetworkInfo; 
var interfaces = netInfo.findInterfaces(); 
for (i = 0; i < interfaces.length; i++) 
{ 
    air.trace(interfaces[i].name]; 
    air.trace(" hardware address: ", interface.hardwareAddress); 
}

配列での繰り返し処理と同様に、NetworkInfo オブジェクトのベクターで繰り返し処理を実行します。 for ループと角括弧を使用して、ベクターのインデックス要素にアクセスします。

NetworkInterface オブジェクトの interfaces プロパティは InterfaceAddress オブジェクトのベクターです。次のコードは上記の例を拡張したものです。各ネットワークインターフェイスのインターフェイスアドレスを列挙する関数が追加されています。

var netInfo = air.NetworkInfo; 
var interfaces = netInfo.findInterfaces(); 
for (i = 0; i < interfaces.length; i++) 
{ 
    air.trace(interfaces[i].name]; 
    air.trace(" hardware address: ", interface.hardwareAddress); 
    air.trace(" addresses: ", traceAddresses(i); 
} 
 
function traceAddresses(i) 
{ 
    returnString = new String(); 
    for (j = 0; j < interfaces[i].addresses.length; j++) 
        returnString += interfaces[i],addresses[j].address + " "; 
    } 
}

ベクターがある AIR API の設定

arguments プロパティの NativeProcessStartupInfo クラスは文字列のベクターです。このプロパティを設定するには、 air.Vector() コンストラクターを使用して文字列のベクターを作成します。 push() メソッドを使用して、ベクターに文字列を追加することができます。

var arguments = new air.Vector["<String>"](); 
 
arguments.push("test"); 
arguments.push("44"); 
 
var startupInfo = new air.NativeProcessStartupInfo(); 
startupInfo.arguments = arguments; 
startupInfo.executable = File.applicationDirectory.resolvePath("myApplication.exe"); 
 
process = new air.NativeProcess(); 
process.start(startupInfo);

ネイティブプロセス API の使用について詳しくは、『 ネットワーキングとコミュニケーション 』の「ネイティブプロセスとの通信」を参照してください。