可变参数函数声明
可变参数函数声明时的一个特点就是函数里边带“…”符号。声明的代码就像下边这样:
- (void)variableParameterFunction:(id)arg1, ... NS_REQUIRES_NIL_TERMINATION;
简单解读一下:
arg1:函数的第一个参数,这个参数的作用就是设定一个起始标识,这个标识定义了所有可变参数的类型,也就是所有的这些可变参数的类型都是id类型的。当然如果你希望再添加几个固定类型的参数的画可以在arg1之前添加,例如:
- (void)variableParameterFunction:(id)arg1 andOtherArguments:(id)arg2, ... NS_REQUIRES_NIL_TERMINATION;
NS_REQUIRES_NIL_TERMINATION:这个宏是在NSArray中的initWithObjects函数声明的时候看到的。它的作用就是在你调用此函数的时候会提示用户最后一个参数一定要是nil哟~ 至于怎么提示的请看下图(当然,如果用户死其白咧要弄个非nil的参数,就肯定会导致异常的。所以最好在函数的文档中写清楚最后一个参数必须为nil【请见
Snippets】):
实现可变参数函数
声明已经完成了,现在的需要实现的就是怎么在函数体里边把这些不定个数的参数取出来了。
- (void)variableParameterFunction:(id)arg1, ... NS_REQUIRES_NIL_TERMINATION{
//存储参数的数组
NSMutableArray *argsArray = [[NSMutableArray alloc] initWithCapacity:10];
//指向可变参数集的指针
va_list params;
//根据可变参数的标识参数初始化params这个指针
va_start(params, arg1);
//用于临时存储每个参数对象
id arg;
if(arg1){
//存储第一个参数【因为初始化的指针是不指向这个参数的,所以需要先存储起来】
id prev = arg1;
[argsArray addObject:prev];
//循环存储其他参数
do{
if(arg){
[argsArray addObject:arg];
}
arg = va_arg(params, id);
}while (arg != nil);//当遇到nil的时候停止获取参数
//清空参数列表并释放可变参数集的指针
va_end(params);
}
//打印所有参数内容【仅为了测试所以所有参数均为NSString类型的对象】
for(NSString *str in argsArray){
NSLog(@"%@", str);
}
return ;
}
Snippets
为了方便使用,我也创建了一个Snippets以供往后的时候用的方便。【主要还是怕忘了】
- (void)<#FucntionName#>:(<#ArgumentType#>)<#ArgumentName#>, ... NS_REQUIRES_NIL_TERMINATION{
va_list params;
va_start(params, <#ArgumentName#>);
NSArray *argsArray = [self variableParameterFunction:<#ArgumentName#> arguments:params];
<#DoSomething#>
}
/**
* 获取可变参数函数的所有参数(包括第一个参数)
*
* @param arg1 第一个参数
* @param argList 其他参数的列表
*
* @return 包含所有参数的数组
*
* @abstract !注:最后一个参数必须为nil,并且其他参数不能为nil,否则会导致崩溃
*/
- (NSArray *)variableParameterFunction:(NSString *)arg1 arguments:(va_list)argList{
NSMutableArray *argsArray = [[NSMutableArray alloc] initWithCapacity:2];
va_list params = argList;
// va_start(params, arg1);
id arg;
if(arg1){
id prev = arg1;
[argsArray addObject:prev];
do{
if(arg){
[argsArray addObject:arg];
}
arg = va_arg(params, id);
}while (arg != nil);
va_end(params);
}
return argsArray;
}
如果有幸你能读到这篇博文的话为你推荐几个有用的
Snippets