情景回顾(OC篇)
在使用oc开发的时候就接触了函数可变参数的概念,用的最多的当然是在创建UIAlertView和ActionSheet时。自己也曾定义过这样的函数。然后取参的话使用的是 c函数中的这几个宏:
void va_start(va_list arg_ptr, prev_param);
void va_arg(va_list arg_ptr, type);
void va_end(va_list arg_ptr);
使用过程如下:
-(int)add:(int)item, ...
{
va_list list; //定义一个指向个数可变的参数列表的指针
va_start(list, item); //得到一个可变参数的地址,第一个参数传入列表指针,第二个参数传入函数接收的第一个参数
int result = 0;
NSLog(@"第一个参数:%d", item);
result += item;
int arg; //声明一个中间值,用来接收遍历可变参数列表时,取出的参数
while ((arg = va_arg(list, int))) { //得到列表中的下一个参数,第一个参数传入列表指针,第二个参数为此函数可变参数的类型。
//循环的结束条件是arg不存在,即为nil
NSLog(@"当前参数:%d" , arg);
result+=arg;
}
va_end(list); //置空列表指针
return result;
}
@end
在使用此类型的函数定义时需要熟悉va_start、va_arg和va_end等宏的使用。
swift篇
在swift里对于可变参数定义和使用变成了如下这样:
func arithmeticMean(_ numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
在传入的参数类型后边加上...即声明了该参数是可变长度的,而我们在取参的时候只需要将其当成数组去处理,这似乎比oc省心了不少。
网友评论