C函数在程序中用到一下这些宏:
void va_start(va_list arg_ptr, prev_param);
void va_arg(va_list arg_ptr, type);
void va_end(va_list arg_ptr);
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引用的函数中正常返回。
我们使用C程序的工具来实现一个OC版本的可变参数函数
#import <Foundation/Foundation.h>
@interface AddVarFun : NSObject
//可变参数的类型须一致
//可变参数,传入的最后一个参数必须为nil
- (int)add:(int)item,...;
#import "AddVarFun"
@implementation AddVarFun
- (int)add:(int)item, ...
{
va_list list; //定义一个指向个数可变的参数列表的指针
va_start(list, item); //得到一个可变参数的地址,第一个参数传入列表指针,第二个参数传入函数接收的第一个参数
int result = 0;
NSLog(@"第一个参数:%d", item);
result += item;
int arg; //声明一个中间值,用来接收遍历可变参数列表时,取出的参数
while ((arg = va_arg(list, int))) { //得到列表中的下一个参数,第一个参数传入列表指针,第二个参数为此函数可变参数的类型。
//循环的结束条件是arg不存在,即为nil
NSLog(@"当前参数:%d" , arg);
result+=arg;
}
va_end(list); //置空列表指针
return result;
}
@end
#import <Foundation/Foundation.h>
#import "AddVarFun"
int main(int argc, const char *arg[])
{
@autoreleasepool{
AddVarFun *addTest = [ [AddVarFun alloc] init];
int result = [addTest add:1, 2, 3, 4, 5, nil];
NSLog(@"%d", result);
}
return 0 ;
}
一个简单的OC实现的可变参数加法函数就实现了,实现时需注意,定义函数前要确定传入的可变参数的类型一致。调用时,传入的最后一个参数必须为nil。通过类似方式我们可以根据自己的需要,实现自己的可变参数函数。