AS3 “with” keyword and casting

I’ve rarely (if ever) used the “with” keyword in as3, but I recently found a neat trick to use it with.

When I quickly need to cast an object to access a few methods/properties I don’t always want to
create a new casted variable:

var child:DisplayObject = getChildThatMightBeMovieClip();

if (child is MovieClip) {
	var childAsMc:MovieClip = child as MovieClip;
	trace(childAsMc.numChildren);
	trace(childAsMc.currentFrame);
}

or cast it every single time:

var child:DisplayObject = getChildThatMightBeMovieClip();

if (child is MovieClip) {
	trace((child as MovieClip).numChildren);
	trace((child as MovieClip).currentFrame);
}

Using the “with” keyword, we can temporarily cast it without creating a temporary casted variable or casting it again and again:

var child:DisplayObject = getChildThatMightBeMovieClip();

if (child is MovieClip) {
	with (child as MovieClip) {
		trace(numChildren);
		trace(currentFrame);
	}
}

Elegant =)

Tags: , , , , ,

7 Responses to “AS3 “with” keyword and casting”

  1. jooj Says:

    Simpler:

    var child:MovieClip = getChildThatMightBeMovieClip() as MovieClip;

    if (child) {

    }

  2. SHAMS Says:

    Thanks
    I usually use nested “with”, for my object arrays.

  3. Ashish Says:

    Thanks for the post.

    @jooj

    checking if (child) wont guarantee whether its a a movie clip or not.
    and hence

    var child:DisplayObject = getChildThatMightBeMovieClip();

    if (child is MovieClip) {
    with (child as MovieClip) {
    trace(numChildren);
    trace(currentFrame);
    }
    }

    stands out….

  4. beatless Says:

    thank you for sharing.

  5. Pratibha Says:

    its good

  6. John Says:

    Question: Does this improve speed of execution over casting over and over, and does this improve memory usage over creating a temporary variable?

  7. Flassari Says:

    This is very likely slower, and I actually recommend using the “as” keyword instead if you want a more proper way of checking this since it’s faster, has compile-time checking of properties and it returns null if the child isn’t moveclip:

    var mc:MovieClip = getChildThatMightBeMovieClip() as MovieClip;
     
    if (mc) {
    	trace(mc.numChildren);
    	trace(mc.currentFrame);
    }
    

    The use case that I posted might not be the best way of handling it, I only posted it as an example =)