什么是可变长参数?
可变长参数:顾名思义,就是函数的参数长度(数量)是可变的。比如C语言的printf系列的(格式化输入输出等)函数,都是参数可变的。下面是printf函数的声明:
int printf(const char *format, …);
可变参数函数声明方式都是类似的
如何实现?
ObjC中没有提供直接的变长参数方法,需要使用C标准库中得av_list方法,使用简单:
C语言可变参数通过三个宏(va_start、va_end、va_arg)和一个类型(va_list)实现的。
具体的参数含义为:
va_list : 定义一个指向个数可变的参数列表指针,存储参数的类型信息。
void va_start(va_list ap, paramN) :
参数:
ap: 可变参数列表地址
paramN: 确定的参数
功能:初始化可变参数列表(把函数在paramN之后的参数地址放到ap中)。
void va_end(va_list ap) :
功能: 关闭初始化列表(将ap置空)
type va_arg(va_list ap, type) :
功能: 返回下一个参数的值
使用示例
类似格式化输出的示例
1 |
- (void)aMethod:(NSString *)a, ... { |
调用这个方法以及输出的结果为:
[self aMethod:@"传入两个参数一个是整数: %d,另外一个是字符串: %@", 12, @"哈哈"];
结果:传入两个参数一个是整数: 12,另外一个是字符串: 哈哈
类似sql语句赋值的示例
1 |
- (NSArray *)actionUseNum: (id)actionNum, ... { |
调用这个方法以及输出的结果为:
[self actionUseNum:[NSNumber numberWithInt:1],
[NSNumber numberWithInt:2],
[NSNumber numberWithInt:3],
[NSNumber numberWithInt:4], nil];
1 |
结果为: |