2016-03-19 31 views
-1

在Apple的OC教程中閱讀這樣的函數調用。有點困惑功能stringWithFormat是如何定義或者它的簽名......如果參數在調用時被逗號而不是冒號分隔,那麼函數簽名是什麼?

[NSString stringWithFormat:@"The magic number is %i", magicNumber]; 

的相對的問題是有關的NSLog作爲

NSLog(@"%i is a number", someScalarVarNumber); 

如果一個函數調用像

[Obj FuncName:param FuncName1:param1 FuncName2:param2]; 
+0

http://www.apeth.com/iOSBook/ch03.html#_parameter_lists - http://publications.gbdirect.co.uk/c_book/chapter9/stdarg.html – matt

+2

'stringWithFormat'是一個Objective-C方法。 'NSLog'是一個C函數。 – matt

回答

1

你說:

[我是]有點c關於如何定義功能stringWithFormat或其簽名。

如果命令 - 點選在你的代碼stringWithFormat,它會帶你直接到它的聲明(你可以點擊「返回」按鈕,返回到你的代碼)。無論如何,stringWithFormat定義如下:

+ (instancetype)stringWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2); 

那些省略號(...)表明它是一個「variadic function」,即它需要的由逗號分隔的參數的可變長度列表。這是一個C編程模式,它也被合併到Objective-C中。

在如果你想知道,這是NS_FORMAT_FUNCTION一絲向編譯器,所述第一參數(1)是printf風格格式字符串(或者更準確地說,稍微更豐富的再現該NSString用途),並且該參數從第二個參數(2)開始應該與格式字符串中顯示的內容匹配。這讓編譯器檢查你的參數列表,看它是否與格式字符串匹配。

,他們覺得有必要增加這個特殊的邏輯printf風格的參數其實是一個線索可變參數參數的更深層次的問題,這一事實:隨着printf風格的情況外,很難確保傳遞給參數該函數匹配函數期望的內容。

因此,通常您只會看到可變方法聲明,其中傳遞給方法的參數數量是可變的,並且它有一個printf樣式的格式字符串。 (從技術上講,你可以在任何情況下使用它,但是在這些情況下,通常有更好的方法,比如傳遞一個數組。事實上,如果你看看Apple的新Cocoa API,他們需要可變數量的參數,他們一般傳遞一個數組,而不是使用一個可變的模式,你會在一些上了年紀的API見)

所以,你說得對,我們一般調用的方法等等等等。

[objectName funcName:firstValue secondParameterName:secondValue thirdParameterName:thirdValue]; 

但是,在特殊情況下,您可以聘請variadic functions

+1

啊...這是我知道的Java中的可變參數對應....感謝的人。 –

相關問題