可變參數(shù)的函數(shù)在Objective-C中不罕見(jiàn),像Cocoa中的很多常見(jiàn)的函數(shù)都是可變參數(shù)的,如:
NSLog(NSString*format, ...)
+?(id)arrayWithObjects:(id)firstObj, ...
+?(id)dictionaryWithObjectsAndKeys:(id)firstObject , ...
那我們?nèi)绾螌?shí)現(xiàn)自己的變參函數(shù)呢,其實(shí)我們需要用到C語(yǔ)言中關(guān)于變參的一組宏:va_start,va_arg,va_end,以下示例是一個(gè)變參函數(shù)的實(shí)現(xiàn):
- (void)method:(NSString*)value,...
{
//指向變參的指針
va_list list
//使用第一個(gè)參數(shù)來(lái)初使化list指針
va_start(list, value);
NSString*string = nil;
while((string = va_arg(list,NSString*)))
{
//返回可變參數(shù),va_arg第二個(gè)參數(shù)為可變參數(shù)類型,如果有多個(gè)可變參數(shù),依次調(diào)用可獲取各個(gè)參數(shù)
?????????????? NSLog(@"%@",string);
}
//結(jié)束可變參數(shù)的獲取
?va_end(list);
}
函數(shù)調(diào)用:[self method:@”1”,@”2”,@”3”,nil];像大多數(shù)變參函數(shù)一樣,未尾一定要加上nil,因?yàn)檫@一組宏都沒(méi)有提供對(duì)參數(shù)個(gè)數(shù)的檢測(cè),當(dāng)然你可以會(huì)問(wèn)為何NSLog的參數(shù)中我們都不用在末尾添加nil的參數(shù)呢,那是因?yàn)镹SLog的第一個(gè)參數(shù)是一個(gè)格式化字符串,通過(guò)這個(gè)字條串就能獲得后面的參數(shù)個(gè)數(shù),所以如果你的函數(shù)還能有其它的參數(shù)能夠顯式的指出變參個(gè)數(shù),當(dāng)然你也可以書寫(但在函數(shù)體中需要修改為按已知個(gè)數(shù)調(diào)用va_arg),但是我仍然推薦以上的寫法!