Feeds:
文章
留言

Archive for 九月 17th, 2006

 

註解

AS3.0 支援兩種註解,這兩種註解和 C++/Java  一樣,一個是用於單行註解的 // 和多行註解的 /* */,下面是一個簡單的註解範例

var x:Object = new Object();  // 這是註解

var i:int = 100; /* 這也是註解 */

常數定義

AS3.0 支援常數定義,常數定義在原來變數宣告的 var 以 const 修飾字取代即可。表示這個變數定義之後不能在變更內容值。常數定義的值只能指定一次,雖然線上手冊說有兩個地方可以賦予值:變數宣告時和類別建構式。可是我測試建構式中進行初始化會出現錯誤(還沒找到原因);

// CConstTest.as 
package {
	import flash.display.Sprite; 	

	public class CConstTest extends Sprite{		
		public function CConstTest(){
			var o:CConst = new CConst();
			trace( o.AUTHOR );  // Arick
			//trace( o.VERSION ); //
 		}
	}	
}

// CConst.as
package {
	public class CConst{
	  public const AUTHOR:String = "Arick";
	  // public const VERSION:int; // 

	  public function CConst(){
		//VERSION = 10;		// Error: 只有初始設定式才能指定常數變數。	
	  }
	}
} 

條件判斷

AS3 支援的條件判斷語法有下面 3 種

1. if … else …
2. if … else if …
3. switch

由於和大部分的語言沒有什麼不同,以下面的範例來看一下他的用法即可理解。

// CSyntaxTest.as
package {
	import flash.display.Sprite; 	

	public class CSyntaxTest extends Sprite{		
		public function CSyntaxTest(){
			var o:CSyntax = new CSyntax();
			trace( o.min(99, 8) );  // 8

			trace( o.Sign(99) );  // 1
			trace( o.Sign(0) );   // 0
			trace( o.Sign(-7) );  // -1

			trace( o.ChangeUser( 0 ) ); // Arick
			trace( o.ChangeUser( 1 ) ); // Mavis 
			trace( o.ChangeUser( 2 ) ); // James
			trace( o.ChangeUser( 3 ) ); // Unknown
 		}
	}	
}

// CSyntax.as
package {
	public class CSyntax{		
		public function CSyntax(){

 		}

		/**
		 * if ... else ... 語法
		 *
		 * 取得兩數的最小值
		 **/
		public function min(a:int, b:int):int{
			if (a>b){
				return b;
			}else{
				return a;
			}
		}

		/**
		 * if ... else if ... 語法
		 *
		 * 傳入一個數值判斷正負數, 
		 *  = 1   正
		 *  = -1  負
		 *  = 0   0
		 **/
		public function Sign(i:int):int{
			if ( i == 0){
				return 0;
			} else if ( i < 0 ){
				return -1
			} else {
				return 1;
			}
		}

		/**
		 * 使用 swtich 建立一個 int-String 名稱對照表
		 *
		 **/
		public function ChangeUser(i:int):String{
			var User:String;

			switch( i ){
			case 0:	
				User = 'Arick';	
				break;
			case 1:
				User = 'Mavis';
				break;
			case 2:
				User = 'James';
				break;
			default:
				User = 'Unknown';
				break;
			}

			return User;
		}
	}
}

迴圈

AS3 支援的迴圈語法共下面五種,前三種在一般語言中很常見,第4種在 Javascript 種很常用,而第5種是我第一次看過的語法。

1. for
2. while
3. do … while
4. for … in
5. for each … in

我們用個簡單的九九乘法表來示範前三種迴圈語法

 範例(九九乘法表):

// CLoopTest.as
package {
	import flash.display.Sprite; 	

	public class CLoopTest extends Sprite{		
		public function CLoopTest(){
			//var o:CLoop = new CLoop();
			CLoop.forSyntax();
			CLoop.whileSyntax();
			CLoop.doSyntax();
 		}
	}	
}

// CLoop.as
package {
	public class CLoop{		
		public function CLoop(){

 		}

		/**
		 * for 語法
		 *
		 **/
		public static function forSyntax():void{
			trace('== for ==');
			var result:String = '';
			for(var i:int = 1; i <= 9; ++i){
			  for(var j:int = 1; j<= 9; ++j){
				 result += String(i*j) + "t";
			  }
			  result += "n";
			}
			trace(result);
		}

		/**
		 * while 語法
		 *
		 **/
		public static function whileSyntax():void{
			trace('== while  ==');
			var result:String = '';
			var i:int = 1;
			var j:int = 1;
			while(i<=9){

				j = 1;
				while( j <= 9){
					result += String(i*j) + "t";
					++j;
				}
				result += "n";
				++i;
			}
			trace(result);
		}

		/**
		 * do ... while 語法
		 *
		 **/
		public static function doSyntax():void{
			trace('== do ... while ==');
			var result:String = '';
			var i:int = 1;
			var j:int = 1;
			do {
				j = 1;
				while( j <= 9){
					result += String(i*j) + "t";
					++j;
				}
				result += "n";
				++i;
			}while(i<=9);

			trace(result);
		}
	}	
}

執行結果:

以下來示範 for … in 和 for each … in 寫法 

// CLoopTest.as
package {
	import flash.display.Sprite; 	

	public class CLoopTest extends Sprite{		
		public function CLoopTest(){
			CLoop.forInSyntax();
			CLoop.forEachSyntax();
 		}
	}	
}

// CLoop.as
package {
	public class CLoop{		
		public static function forInSyntax():void{			
			var Person:Object = {
				  Name: 'Arick'
				, Sex: 1				
			};

			for (var key:String in Person) {
				trace (key + " : " + Person[key]);
			}
			/* 輸出結果
			 * Sex : 1
			 * Name : Arick
			 */

			var NameSet:Array = [
				  'Arick'
				, 'Mavis'
				, 'Joss'
				, 'Jack'
			];

			for (var idx:String in NameSet) {
				trace (idx + " : " + NameSet[idx]);
			}

			/* 輸出結果
				0 : Arick
				1 : Mavis
				2 : Joss
				3 : Jack
			 */
		}

		public static function forEachSyntax():void{
			var Person:Object = {
				  Name: 'Arick'
				, Sex: 1				
			};

			for each(var value:* in Person) {
				trace (value);
			}
			/* 輸出結果
			 * 1
			 * Arick
			 */

			var NameSet:Array = [
				  'Arick'
				, 'Mavis'
				, 'Joss'
				, 'Jack'
			];

			for (var Name:String in NameSet) {
				trace (Name);
			}
			/* 輸出結果
				Arick
				Mavis
				Joss
				Jack
			 */
		}
	}	
}
 

for…in 用來迭代陣列和物件的成員,上述的 forInSyntax() 函數即示範這個用途,雖然說他可以迭代物件的成員,可是不能用來迭代 class 定義的物件。但是可以用來迭代 dynamic 定義的 Class。如下範例: 

// CIteratorTest.as
package {
	import flash.display.Sprite; 	

	public class CIteratorTest extends Sprite{		
		public function CIteratorTest(){
			var elem:String;
			var nc:NormalClass = new NormalClass();
			for(elem in nc){
				trace( elem + '/' + nc[elem]);
			}

			var dc:DynamicClass = new DynamicClass();
			dc.Name = 'DynamicClass';
			dc.getName = function():String{
				return this.Name;
			};
			for(elem in dc){
				trace( elem + '/' + dc[elem]);
			}
 		}
	}	
}

// NormalClass.as
package {
	public class NormalClass{		
		public var Name:String = 'NormalClass';

		public function NormalClass(){
 		
		}

		public function getName():String{
			return Name;
		}
	}	
}

// DynamicClass.as
package {
	public dynamic class DynamicClass{		
		public function DynamicClass(){
 		
		}
	}	
}

執行結果:
 
如果你迭代陣列或物件時不在意索引值,可以使用 for each … in 語法來取代 for … in ,改寫上述範例如下:

// CIteratorTest.as
package {
	import flash.display.Sprite; 	

	public class CIteratorTest extends Sprite{		
		public function CIteratorTest(){
			forEachIn();
 		}

		private function forEachIn():void{
			var elem:String;
			var nc:NormalClass = new NormalClass();
			for each(elem in nc){
				trace( elem);
			}

			var dc:DynamicClass = new DynamicClass();
			dc.Name = 'DynamicClass';
			dc.getName = function():String{
				return this.Name;
			};
			for each(elem in dc){
				trace( elem);
			}			
		}
	}	
}

 
執行結果:
 
你如果有仔細看的話會發現兩個執行結果的順序會不太一樣,依據線上手冊說明他的順序是亂數(random)的。for each … in 除了剛剛所說得差異之外,他的主要用途還是在處理 XML,他可以用來迭代 XML 和 XMLList 物件,如下:

// CIteratorTest.as
package {
	import flash.display.Sprite; 	

	public class CIteratorTest extends Sprite{		
		public function CIteratorTest(){
			xmlTest();
 		}

		private function xmlTest():void{
			var myXML:XML = <users>
					<fname>Jane</fname>
					<fname>Susan</fname>
					<fname>John</fname>
				       </users>;
			for each (var item in myXML.fname) {
				trace(item);
			}
			/* 輸出結果
				Jane
				Susan
				John
			*/
		}
	}	
}

XML 處理以後談到時再詳細說明。

Read Full Post »