多個參數的寫法函數
(方法的數據類型)函數名:(參數1數據類型)參數1的數值的名字 參數2的名字: (參數2數據類型) 參數2值的名字 …. ;this
舉個例子,一個方法的定義:對象
-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName;blog
實現這個函數的時候:ci
-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName編譯器
{ string
大兒子 = myOldestKidName; 二兒子 = mySecondOldestKidName; 三兒子 = myThirdOldestKidName;it
}編譯
調用的時候:變量
Kids *myKids = [[Kids alloc] init];
[myKids setKids: @」張大力」 secondKid: @」張二力」 thirdKid: @」張小力」];
一上內容爲引用 ,引用地址tp://blog.163.com/long_wtf/blog/static/185553270201111910536/
剛開始接觸Objective-C的時候,會感受這種函數聲明和調用都有點怪,實際是受C和C++傳統函數聲明方式的影響,看會C++的函數聲明
void setKids(string *myOldestKidName , string *mySecondOldestKidName , string *myThirdOldestKidName);
調用的時候:
myKids.setKids("張大力","張二力","張小力");
在C++裏,以咱們的觀點這個函數的」函數名「是setKids,而後()內是參數類型和形參變量
C++中有overload(重載)的概念,咱們能夠聲明void setKid(int myOldestKidAge , string *mySecondOldestKidName , string *myThirdOldestKidName);
編譯器是如何識別這兩函數呢,實際是對於編譯器會將全部參數的類型加到函數名上,變成setKid_string_string_string 和setKid_int_string_string (這裏忽略了this等隱藏參數)
對於編譯器咱們的兩個setKid本來就是不一樣的,重載只是對於咱們而言。
對於Objective-C中,許多人認爲「Objective-C中參數表是這樣的, 參數名:(數據類型)形參名。第一個參數的參數名就是函數名」,其實這種理解不太正確,對於Objetive-C的函數名應該是由全部參數名的組合的,如上例中函數名是setKid:secondKid:thirdKid: 有使用過@selector的同窗,會知道咱們使用@selector得到帶三個參數的函數的sel類型(能夠當函數標識符理解)須要這樣用@selector(setKid:secondKid:thirdKid)。
因此個人理解時函數名是setKid:secondKid:thirdKid: ,而setKid實際是第一個參數的參數名。
這有一個問題是Objecitve-C爲何不像C++同樣,直接使用形參的數據類型放到函數名裏,而非要讓咱們給每個形參定義一個參數名呢。這是由於重載的方法只在類的內部,在C++中若是讓同一函數在子類父類的不一樣對象中執行相同函數名有不一樣的實現,重載是辦不到的,咱們須要加vitrual關鍵字,把它聲明成虛函數,這就是多態。在Objetive-C中全部的函數均是具備多態特性的,均可在運行時動態執行調用,咱們須要一種方式對於全部的同名函數,在不一樣的對象能夠動態執行,這時候Objetive-C便選擇了中綴表達方式。