可变参数函数初探 Variable Paramenter Function
来源:互联网 发布:淘宝刷好评兼职要会费 编辑:程序博客网 时间:2024/06/04 19:49
可变参数函数声明
可变参数函数声明时的一个特点就是函数里边带“…”符号。声明的代码就像下边这样:
- (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
0 0
- 可变参数函数初探 Variable Paramenter Function
- 可变参数函数例子(variable parameter function)
- C语言的函数重载与可变参数函数--variable argument in function
- 可变参数(variable-argument)
- lua function 可变参数
- Variable Arguments (Varargs) 可变参数.
- Java 可变参数 variable parameter
- Lua function函数,可变参数, 局部函数,尾递归优化
- Java中的可变参数Variable Parameter
- Lua中的函数(function)、可变参数、局部函数、尾递归优化等实例讲解
- 可变参数 函数(可变参数列表--1)
- 可变参数函数 可变参数宏
- 可变参数函数
- 可变参数函数实现
- 可变参数函数
- 可变参数函数实现
- c可变函数参数
- 可变参数函数
- uva208Firetruck(并查集 + DFS)
- UVA 10367 - Equations(数论+模拟)
- 《Thinking in Algorithm》12.详解十一种排序算法
- 九度题目1153:括号匹配问题
- LVM管理体系(一)创建含有两个物理分区的逻辑卷(操作步骤)
- 可变参数函数初探 Variable Paramenter Function
- Android中WebView实现Javascript调用Java类方法
- shell中使用的小常识
- java入门学习(九)
- 俄罗斯方块
- Palindromes
- 《数据结构、算法与应用》6.(递归查询数组中是否包含某元素).
- 新新手开发入门教程(0)
- 同样25岁,为什么有的人事业小成,有的人却还一无所有?