2011年9月8日 星期四

讓函式可以接收不定長度的參數

使用的方式、概念,
都跟 C++ 相同。


利用三個內建函式來取得資料:

1. va_start(<#ap#>, <#param#>)
2. va_arg(<#ap#>, <#type#>)
3. va_end(<#ap#>)

ap: argument pointer ,使用 va_list 宣告的型別
param: 最後一個接收到的指定參數
type: 指定所取得的參數是何種型別


ex:
[declaration]
-(NSMutableArray*) arguCollection:(NSString *) str, ...{
NSMutableArray *ret = [NSMutableArray new];

va_list argList;
NSString *get;

va_start(argList, str);
while ((get=va_arg(argList, NSString*))) {
[ret addObject:get];
}

return ret;

}

進入到函式裡時,
函式所接收到的參數們會收集在一個陣列裡,
以上面的例子來看,
就是長成這樣子 ->
[str, var_1, var_2, ..., var_N] 。

一使用 va_list 宣告
argList 時,
就會將
argList 指向這個陣列。

經過 va_start 執行後,
argList 指標就會指到 var_1 的位置,
所以要告訴 va_start 不定參數從哪開始時,
就得利用 str 這個變數來指定。

再用
va_arg 函式後,
即可取得資料了...

[test]
[
<#instance#> arguCollection:@"test", @"1", @"2", @"3", nil]

使用時最後面要給 nil ,
原因是為了讓 while 迴圈知道什麼時候該停止。


沒有留言:

張貼留言