什么是可变长参数?
可变长参数:顾名思义,就是函数的参数长度(数量)是可变的。比如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) :
功能: 返回下一个参数的值
使用示例
类似格式化输出的示例
123456789 |
- (void)aMethod:(NSString *)a, ... { va_list ap; va_start(ap, a); NSString *str = [[NSString alloc] initWithFormat:a arguments:ap]; NSLog(@"%@", str); va_end(ap);} |
调用这个方法以及输出的结果为:
[self aMethod:@"传入两个参数一个是整数: %d,另外一个是字符串: %@", 12, @"哈哈"];
结果:传入两个参数一个是整数: 12,另外一个是字符串: 哈哈
类似sql语句赋值的示例
12345678910111213141516171819202122 |
- (NSArray *)actionUseNum: (id)actionNum, ... { NSMutableArray *argsArray = [[NSMutableArray alloc] init]; va_list params; //定义一个指向个数可变的参数列表指针 id arg; if (actionNum) { va_start(params, actionNum); //得到第一个可变参数地址 // 将第一个参数添加到array,要根据情况来使用下面两句把第一个参数加入array,有的情况不用加入。 // 例如第一个参数是sql语句,后面的参数是sql ? 用的变量,那就要删除下面的两句。 id prev = actionNum; [argsArray addObject:prev]; while ((arg = va_arg(params, id))) { if (arg) { [argsArray addObject:arg]; } } va_end(params); for (NSNumber *num in argsArray) { NSLog(@"%d", [num intValue]); } } return argsArray;} |
调用这个方法以及输出的结果为:
[self actionUseNum:[NSNumber numberWithInt:1],
[NSNumber numberWithInt:2],
[NSNumber numberWithInt:3],
[NSNumber numberWithInt:4], nil];
12345 |
结果为:2015-12-31 13:06:29.214 ContactManagement[21213:713439] 12015-12-31 13:06:29.214 ContactManagement[21213:713439] 22015-12-31 13:06:29.214 ContactManagement[21213:713439] 32015-12-31 13:06:29.214 ContactManagement[21213:713439] 4 |
时间: 2024-10-31 05:38:16