2012-04-16 156 views
3

在AS3中,我們可以通過兩種方式複製數組:深拷貝

newArr = oldArr.concat(); 

var ba:ByteArray = new ByteArray(); 
ba.writeObject(oldArr); 
ba.position = 0; 
newArr = ba.readObject() as Array; 

但是這兩種方式,當我需要複製不使用矢量工作一個具有複雜數據類型的Vector。就像Vector.<Point>。當我使用ByteArray複製具有複雜數據類型的Vector時,編譯器說新的Vector I將舊的複製爲null。

回答

3

寫你的對象爲ByteArray,例如:

var points:Vector.<Point> = new Vector.<Point>(); 
var pointsCloned:Vector.<Point>; 
var ba:ByteArray = new ByteArray(); 

registerClassAlias("flash.geom.Point", Point); 

points.push(new Point(1, 2)); 
points.push(new Point(3, 4)); 
points.push(new Point(5, 6)); 

ba.writeObject(points); 
ba.position = 0; 
pointsCloned = ba.readObject() as Vector.<Point>; 

trace(points); 
trace(pointsCloned); 

由於這個blog post之前註冊類的別名有flash.net.registerClassAlias

+0

哦,它的工作原理well.Thanks!但爲什麼它只能在註冊一個類別別名之後才起作用? – Piggyi 2012-04-17 13:16:16

+0

@Piggyi你可以在[ActionScript 3.0參考資料]中找到簡短的解釋(http://livedocs.adobe.com/livecycle/8.2/programLC/common/langref/flash/net/package.html#registerClassAlias%28%29 )。這就是我所知道的一切。 – Matthias 2012-04-17 15:09:55

0

另一種選擇是使用.map(),像:

function pointCloner(item:Point, index:int, vector:Vector.<Point>):Point { 
    return item.clone(); 
} 

var newVector:Vector.<Point> = oldVector.map(pointCloner);