ios开发-Object-C可变参数函数

简介函数

一个可变参数函数是指一个函数拥有不定的参数,即为一个函数可接收多个参数。有时咱们会遇到一些算术问题须要用到,好比是计算传入参数的总和,字符串的链接或是其它操做过程,咱们在 OC 里也常常使用,最经典的就是 NSLog( C 为 printf ) ,它能够指定格式的输出,格式化输出的内容。spa

 

如今咱们先来看看普通函数的定义方法。.net

 

 

普通函数code

通常咱们定义的函数都是指定有多少个参数,若是是有三个参数,咱们能够这样写。对象

- (void)exampleObj:(NSString *)obj obj2:(NSString *)obj2 obj3:(NSString *)obj3
{
    
}

这样有一个问题,若是咱们须要计算值,好比须要计算5个或10个数值相加的运行,那咱们在函数里是否是须要定义5个或10个的参数?若是有100个数值须要计算 …… 。blog

 

 

可变参数函数ip

如今,咱们能够经过定义 可变参数函数 去实现刚刚的问题,好比咱们如今须要传进来参数的数值之和,并且传的参数个数是不固定的。可变参数函数的定义方法很简单,咱们在参数的后面加上 ", ..."就能够了,例如。字符串

- (void)exampleObj:(NSString *)obj obj2:(NSString *)obj2 obj3:(NSString *)obj3, ...
{
    
}

 

如今,咱们回到刚刚的难题,这个函数主要是用来计算用户传进来的数值之和。get

- (int)sum:(int)num, ...
{
    int result = num;
    int objNum;
    
    va_list arg_list;
    va_start(arg_list, num);
    while ((objNum = va_arg(arg_list, int))) {
        result += objNum;
    }
    va_end(arg_list);
    return result;
}

va_list:用来保存宏 va_start 、va_arg 和 va_end 所需信息的一种类型。为了访问变长参数列表中的参数,必须声明 va_list 类型的一个对象。博客

va_start:访问变长参数列表中的参数以前使用的宏,它初始化用 va_list 声明的对象,初始化结果供宏va_arg和va_end使用;

va_arg:展开成一个表达式的宏,该表达式具备变长参数列表中下一个参数的值和类型。每次调用 va_arg 都会修改,用 va_list 声明的对象从而使该对象指向参数列表中的下一个参数。

va_end:该宏使程序可以从变长参数列表用宏 va_start 引用的函数中正常返回。

 

使用方法

使用方法也很简单,在可变参数里,全部参数均用逗号隔开。

NSLog(@"%d", [self sum:1, 34, nil]);

 

 

注意事项

使用的时候,可变参后最后面加一个nil值,这样是表明结束的意思。就像UIAlertView初始化的那样,它一开始不知道你有多少个Button,你能够自由地往里加Button,最后也是由一个nil结束,因此两个是同样的道理。

 

 

注意点

1)当咱们要建立一个可变参数函数时,必须把省略号( ... )放到参数列表后面,同时也只能拥有一个这样的格式,由于咱们不能定义两个可变的参数。

2)当咱们须要读取 可变参数列表 时,必须先指定一个变数 va_list ,而后使用宏 va_start 、va_arg、va_end 来获取。

 

 

参考:

C可变参数函数 实现 —— http://blog.csdn.net/weiwangchao_/article/details/4857567

维基百科.可變參數函數 —— http://zh.wikipedia.org/wiki/可變參數函數

 

 


博文做者:GarveyCalvin

博文出处:http://www.cnblogs.com/GarveyCalvin/

本文版权归做者和博客园共有,欢迎转载,但须保留此段声明,并给出原文连接,谢谢合做!

相关文章
相关标签/搜索