方法 (Method) 是我們在 Class 中設計的動作,用來對 Class 與 Instance 能做的事情做詳細的描述。以之前的所談到的車子的案例來說,我們可以對 "車的工廠" (類別)設計一個動作叫 ”製造“ ,之後我們就可以製造車子了。但大多數人我們會 "車" 本身 (實體) 下指令,如加速等。
 
Objective-C 中,Method 的呼叫是用傳送訊息,而訊息的名稱,就叫選擇器 (Selector) 的方式完成的。
訊息傳送示意
(本圖來源:ISBN 957-527-624-8 Windows 程式設計...C++實作)
 
傳送訊息的語法如下:
            

               [實體(或類別)   選擇器]


例如說我們可以對車子下一個製造的指令,如果我們已寫好了一個 Car 的類別,我們就可以寫
 
            Car *myCar =  [Car new];
 
上面的意思是說:請 Car 這個類別 new 一個新的 Car 並把它放到我宣告為 Car 的 myCar 這個變數。
 
訊息的傳送可以是巢狀的,其動作會由內而外,例如:
 
            Car *theCar = [[Car alloc] init];
 
動作就改為:先請 Car 類別 alloc (保留一個記憶體位置),再把這個記體體位置 init (初始化,把所有數值設為零或其他初始值),最後它放到我宣告為 Car 的 theCar 這個變數。
 
以上三個方法  new alloc init 等我們都沒有設計,但執行的候都不會出錯,因為那些其實都是 NSObject 的方法,NSObject 是OS X 與 iOS 所有類別的最上層類別,所以用 XCode 製造出來的類別都會有這些方法,但如果我們設計一個要非原生的方法,就要自已寫了。
 
寫一個【方法】與寫一個 C 語言的 function 類似,一樣要有三個動作,【宣告】,【定義】,【呼叫】上面的說明都是呼叫的部份,而宣告與定義部份,就要寫在類別內了。
 
宣告的格式如下
 
scope (returnTypeselector1: (Typeparameter1Name    selector2: (Typeparameter2 .......

看起來格式很長,實際上第2個以後的 Selector

scope 
 
是設定這是一個【類別方法 class method 】或【實體方法 instance method】,類別方法以加號 "+" 表示,實體方法以減號表示 "-"。以車子的案例來說工廠做的工作,如生產一輛車,就是類別方法,而車子的動作,如踏油門,就是實體方法。

returnType
 
回傳值的格式。如同 function 一樣,方法是可以有回傳值的。
 
selector
 
選擇器名稱,也就是 Method 的名稱。Obj-C 比較特別的是每一個參數前,都要有一個名稱,所以我們可以了解每個參數的意義。
 
(Type)parameterName 
 
參數的資料型別與名稱。
 
 
方法的設定很像是 function,但比較特別的是多個參數時的寫法,比如說設定一個速度與方向的方法,XCode 會寫成類似這個樣子:
 
 
-(void)setSpeed:(int)targetSpeed  andDirecition:(int)targetDirection;
 
 
因為是對車子要求,不是對工廠,所以是一個實體方法,在第二個參數前的 selector,在習慣上會以 and 開頭,這並不是要求的規則,約定成俗的習慣,因為這樣比較容易閱讀程式。
 
方法的宣告要放在類別的 @interface 區段,而實作就要放在 @implementation 區段,並寫上實作的內容。以下是一個對車子類別並實作設定方向與速度的實例 
 
@interface Car : NSObject{
    int speed;
    int direction;
}

//這兒宣告方法
-(void)setSpeed:(int)targetSpeed  andDirecition:(int)targetDirection;
@end

@implementation Car
//這兒實作方法

-(void)setSpeed:(int)targetSpeed  andDirecition:(int)targetDirection
{
    // 把實體變數的值設為值入的參數值
    speed=targetSpeed;
    direction=targetDirection;
}
@end

 
然後我們就可以在主程式設一個車然後對它設定速度與方向了

        Car *myCar = [[Car alloc] init ];
        [ myCar  setSpeed:40  andDirection:32];
 
myCar 的 speed 就會被設為 40 ,Direction 設為 32了。

arrow
arrow

    shenfive 發表在 痞客邦 留言(1) 人氣()