方法 (Method) 是我們在 Class 中設計的動作,用來對 Class 與 Instance 能做的事情做詳細的描述。以之前的所談到的車子的案例來說,我們可以對 "車的工廠" (類別)設計一個動作叫 ”製造“ ,之後我們就可以製造車子了。但大多數人我們會 "車" 本身 (實體) 下指令,如加速等。
Objective-C 中,Method 的呼叫是用傳送訊息,而訊息的名稱,就叫選擇器 (Selector) 的方式完成的。
傳送訊息的語法如下:
[實體(或類別) 選擇器]
例如說我們可以對車子下一個製造的指令,如果我們已寫好了一個 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 (returnType) selector1: (Type) parameter1Name selector2: (Type) parameter2 .......
看起來格式很長,實際上第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
@end
@implementation Car
//這兒實作方法
-(void)setSpeed:(int)targetSpeed andDirecition:(int)targetDirection
{
// 把實體變數的值設為值入的參數值
speed=targetSpeed;
direction=targetDirection;
}
@end
然後我們就可以在主程式設一個車然後對它設定速度與方向了
Car *myCar = [[Car alloc] init ];
Car *myCar = [[Car alloc] init ];
[ myCar setSpeed:40 andDirection:32];
myCar 的 speed 就會被設為 40 ,Direction 設為 32了。
文章標籤
全站熱搜
留言列表