2013年9月5日 星期四

[Actionscript 3.0] 淺談Vector與Array陣列之差異

寫Actionscript 3.0到現在已經有好幾年了但一直沒發文分享,今天在這裡介紹一下Vector類別,Vector是Flash Player 10推出時所發佈的新類別,Vector和Array一樣都是陣列類別,不過據官方的說法相較於Array而言,使用Vector可以確保陣列元素的類型安全並獲得較高的運算效能。
 
Vector的用法和Array相似,其所屬的method也和Array一樣,唯一不同的是使用Vector宣告陣列時須指定陣列的基底類型,以下用幾個簡單的範例跟大家說明。
 
 
Array的宣告方式:
var array:Array = new Array();
// or
var array:Array = [];

Vector的宣告方式:
var vector.<int> = new Vector.<int>();

 
 
如同Array一樣,在宣告Vector類別時我們可以指定陣列的長度:
var size:int = 10;
var vector:Vector.<int> = new Vector.<int>(size);

不同於Array類別的是,Vector增加了陣列長度的限制參數,不過當陣列長度被限制時便無法使用如push(), pop(), shift()等method更動其長度:
var size:int = 10;
var fixed:Boolean = true
var vector:Vector.<int> = new Vector.<int>(size, fixed);
vector.fixed = false;

 
 
Vector的元素為安全性的類型,不同於Array的元素可以是多樣的類型:
var string:String = "I am a string";
var date:Date = new Date();
var number:Number = 1138
var array:Array = new Array();
array[0] = string;
array[1] = date;
array[2] = number;
 
trace(array[1] is Date); // true

然而當我們給予Vector不同類型的元素時,程式在compiling時則會產生錯誤:
var string:String = "I am a string";
var date:Date = new Date();
var number:Number = 1138
var vector:Vector.<string> = new Vector.<string>;
vector[0] = string;
vector[1] = date;
vector[2] = number;
 
trace(vector[1] is Date); // false
 
// Compile time errors:
// Implicit coercion of a value of type Date
// to an unrelated type String.
// Implicit coercion of a value of type Number
// to an unrelated type String.

除了前述的差異外,Vector類別的運作方式大致和Array相似,其所使用的APIs也一樣,我們可以經由Vector的索引值操控其元素:
var vector:Vector.<int> = new Vector.<int>();
 
var rand:Number;
for(var i:int = 0; i < 1000; i++)
{
    rand = (Math.floor(Math.random() * 100) as int);
    vector.push(rand);
}
 
 
trace(vector[10]);

 
 
最後,Vector為一個密集式的陣列,即是每個元素必須有一個參數或者是null,例如宣告Array陣列時可以是以下的方式:
var array:Array = new Array();
a[0] = "foo";
a[5] = "bar";

然而使用相同的方式宣告Vector陣列時則會產生錯誤訊息:
var vector:Vector.<string> = new Vector.<string>();
vector[0] = "foo";
vector[5] = "bar";
 
// You will get a RangeError at runtime.

因此我們可以在宣告Vector時指定陣列的長度藉此修正錯誤:
var vector:Vector.<string> = new Vector.<string>(6);
vector[0] = "foo";
vector[5] = "bar";

 
此篇針對Vector與Array陣列的相關性作一個初步的介紹,若想知道更多關於Vector類別的資訊可參考Actionscript 3.0 Vector的官方文件。

沒有留言:

張貼留言