使用矢量

Adobe AIR 1.5 和更高版本

Vector 实例是“指定类型的数组”,这表示 Vector 实例中的所有元素始终具有同一数据类型。某些 AIR API(如 NativeProcess 和 NetworkInfo)使用 Vector 作为属性或方法的数据类型。

在 Adobe AIR 中运行的 JavaScript 代码中,Vector 类是作为 air.Vector(在 AIRAliases.js 文件中)引用的。

矢量基础知识

在声明 Vector 变量或实例化 Vector 对象时,要显式指定 Vector 可以包含的对象的数据类型。指定的数据类型称为 Vector 的“基本类型”。在运行时,会检查用于设置或检索 Vector 值的任何代码。如果要添加或检索的对象的数据类型与 Vector 的基本类型不匹配,则会发生错误。

除数据类型限制之外,Vector 类还具有一些其他限制,从而有别于 Array 类:

  • Vector 是一种密集数组。即使某个 Array 对象在位置 1 到 6 没有值,该对象的索引 0 和 7 处也可以有值。但是,Vector 的每个索引位置都必须有值(或为 null )。

  • Vector 可以是固定长度。这表示 Vector 包含的元素数不能更改。

  • 对 Vector 的元素的访问需要接受范围检查。绝对不能从大于最后一个元素索引 ( length - 1) 的索引中读取值。绝对不能对超过当前最后一个索引一个以上位置的索引设置值(也就是说,只能在现有索引或索引 [length] 处设置值)。

由于 Vector 具有这些限制,因此 Vector 相对于所有元素均为单个类的实例的 Array 实例有三个主要优点:

  • 性能:使用 Vector 实例时的数组元素访问和迭代的速度比使用 Array 实例时的速度要快很多。

  • 类型安全性:这类错误的例子包括将数据类型错误的值分配给 Vector 或从 Vector 中读取值时预期错误的数据类型。在运行时,当向 Vector 对象添加数据或从 Vector 对象读取数据时会检查数据类型。

  • 可靠性:与 Array 相比,运行时范围检查(或固定长度检查)大大提高了可靠性。

除了有一些限制和优点以外,Vector 类与 Array 类非常相似。Vector 对象的属性和方法与 Array 的属性和方法类似(通常完全相同)。对于大多数需要使用所有元素都具有相同数据类型的 Array 的情况,Vector 实例更为可取。

重要概念和术语

以下参考列表包含在对处理例程的数组和矢量进行编程时需要了解的重要术语:

数组访问 ([]) 运算符
一对中括号,其中含有唯一标识数组元素的索引或键。此语法用在矢量变量名称之后,以指定矢量的单个元素而不是整个矢量。

基本类型
允许 Vector 实例存储的对象的数据类型。

元素
矢量中的单个项目。

索引
用于标识索引数组中的单个元素的数字“地址”。

T
本文档中使用的标准约定,用于表示 Vector 实例的基本类型(与具体的基本类型无关)。T 约定用于表示类名称,如 Type 参数说明中所示。(“T”表示“类型”,如同在“数据类型”中一样。)。

类型参数
与 Vector 类名称一起使用以指定 Vector 的基本类型(它存储的对象的数据类型)的语法。该语法包括一个点 ( . ),然后是由尖括号 ( <> ) 括起来的数据类型名称。放在一起后类似于: Vector.<T> 。在本文档中,在类型参数中指定的类通常表示为 T

Vector
一种数组类型,其所有元素都是同一数据类型的实例。

创建矢量

通过调用 air.Vector["<T>"]() 构造函数创建 Vector 实例。调用此构造函数时,即指定了 Vector 变量的基类型。可以使用 type 参数语法指定 Vector 的基本类型。在代码中,类型参数紧跟单词 Vector 。类型参数包括左中括号,然后是字符串(包含用尖括号 ( <> ) 括起来的基类名称),最后是右中括号。下面的示例显示此语法:

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

在此示例中,变量 v 被声明为 String 对象的一个矢量。换句话说,它表示只能包含 String 实例的索引数组。

如果使用不带任何参数的 air.Vector["<T>"]() 构造函数,将创建一个空 Vector 实例。可以通过检查 Vector 的 length 属性来测试它是否为空。例如,下面的代码调用不带参数的 Vector["<T>"]() 构造函数:

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

如果您预先知道 Vector 最初需要多少元素,则可以预定义 Vector 中的元素数。若要使用特定数量的元素创建 Vector,请将元素数作为第一个参数( length 参数)进行传递。因为 Vector 元素不能为空,所以会使用具有基本类型的实例填充这些元素。如果基本类型是允许使用 null 值的引用类型,则所有元素都包含 null 。否则,所有元素都包含该类的默认值。例如,Number 变量不能为 null 。因此,在下面的代码清单中,使用三个元素创建名为 ages 的 Vector,其中每个元素都包含默认 Number 值 NaN

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

使用 Vector["<T>"]() 构造函数还可以创建固定长度 Vector,方法是将 true 作为第二个参数( fixed 参数)进行传递。在这种情况下,将使用指定的元素数创建 Vector,且元素数不可更改。但是请注意,仍然可以更改固定长度 Vector 的元素值。

如果创建 AIR 运行时对象(在 window.runtime 对象中定义的类)的 Vector,请在调用 Vector 构造函数时引用该类的完全限定 ActionScript 3.0 名称。例如,下面的代码创建 File 对象的一个 Vector:

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() )向矢量中插入元素。

注: 如果某个 Vector 对象的 fixed 属性为 true ,则不能更改该 Vector 中的元素数。如果尝试使用 push() 方法或其他方式向固定长度 Vector 添加新元素,则会发生错误。

检索值和删除矢量元素

检索矢量中的元素值的最简单方法是使用数组访问 ( [] ) 运算符。若要检索矢量元素的值,请在赋值语句的右侧使用矢量对象名称和索引编号:

var myFavoriteSong = songTitles[3];

可以尝试使用不存在元素的索引来检索矢量中的值。在这种情况下,Vector 会引发 RangeError 异常。

可以使用 Array 和 Vector 类的三种方法( pop() shift() splice() )删除元素。

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 中的元素数。如果尝试使用此处介绍的方法删除固定长度 Vector 中的元素或截断固定长度 Vector,则会发生错误。

Vector 对象的属性和方法

Array 对象的很多方法和属性都可用于 Vector 对象。例如,可以调用 reverse() 方法来更改 Vector 的元素的顺序。可以调用 sort() 方法对 Vector 的元素进行排序。但是,Vector 类不包含 sortOn() 方法。

有关受支持的属性和方法的详细信息,请参阅《针对 HTML 开发人员的 Adobe AIR 语言参考》中的 Vector 类文档。

示例:使用需要矢量的 AIR API

有些 Adobe AIR 运行时类使用矢量作为属性或方法返回值。例如,NetworkInfo 类的 findInterfaces() 方法返回 NetworkInterface 对象的数组。NativeProcessStartupInfo 类的 arguments 属性 是一个字符串矢量。

访问返回矢量对象的 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

NativeProcessStartupInfo 类的 arguments 属性 是一个字符串矢量。要设置此属性,请使用 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 的详细信息,请参阅 网络与通信 中的“与本机进程通信”。