我已经看到很多代码将对象从一种类型转换为另一种类型,使用我称之为“标准”的转换,如下所示:
var myDO:DisplayObject = loader.content;
var myCastedMC:MovieClip = MovieClip(myDO);
然而,as
运算符似乎以相同的方式工作,因为当我跟踪两个对象时,我得到相同的值:
var myAsMC:MovieClip = myDO as MovieClip;
trace(myAsMC,myCastedMC); //both outputs read [object MainTimeline]
那么,这两者有什么区别?什么时候使用as
运算符,何时使用“标准”投射?
答案 0 :(得分:1)
只有当你确定演员阵容成功时才会施放。如果转换失败,则抛出运行时错误。 你使用'作为'产生一个永远不会抛出错误的软模型。在这种情况下,转换成功或返回数据类型的默认值(对于大多数为null的对象)。 两种演员阵容都是用于非常不同的情况,但由于经常被误解,你会看到' as'当编码器真的意味着直接演员时使用。 如果跟随演员,编码员将不会检查或需要检查演员是否成功,那么它应该使用直接演员。如果跟随演员,编码员需要检查演员表是否成功,他应该使用'作为'。
应该解释为什么杀手回答不正确。提供的代码假设成功:
(getChildAt(i) as TextField).text=i.toString();
含义编码器知道显示列表只包含TextField对象(否则会发生错误)。在这种情况下,建议使用直接演员:
TextField(getChildAt(i)).text = i.toString();
如果显示列表包含其他对象类型,那么' as'可以使用:
var field:TextField = getChildAt(i) as TextField;
if(field)//if null then getChildAt(i) is not a TextField
{
//field exist so cast succeeded
}
答案 1 :(得分:0)
好问题!
他们的区别在于,转换是在编译时转换,“as”是在运行时转换。其他一个是你只能将子类转换为超类。但“as”转换任何东西。
让我们举个例子:
假设我们在舞台上有很多文本字段,我们没有变量或数组。我们想通过循环更改文本:
for(var i:uint=0;i<numChildren;i++){
var t:TextField=getChildAt(i)
t.text=i.toString();
}
可能你看到一个错误,因为getChildAt
返回displayObject而displayObject没有text
属性!
所以你必须在这里使用as
:
for(var i:uint=0;i<numChildren;i++){
(getChildAt(i) as TextField).text=i.toString();
}
H☻pes这有帮助!