1.什么是多选参数?
如果你做过iOS开发,你肯定遇到过下面这样的方法:
- (instancetype)initWithTitle:(nullable NSString*)title message:(nullable NSString*)message delegate:(nullable id)delegate cancelButtonTitle:(nullable NSString*)cancelButtonTitle otherButtonTitles:(nullable NSString*)otherButtonTitles, ...NS_REQUIRES_NIL_TERMINATION
+ (instancetype)arrayWithObjects:(ObjectType)firstObj, ...NS_REQUIRES_NIL_TERMINATION;
此时你可能注意到了,参数otherButtonTitles和参数firstObj都可以传递很多值,并且是以关键字nil结束,这就是多选参数。
2.多选参数的用法
如果在项目中你需要自定义一个带有可变参数的方法,那么我们可以仿照上面的例子自定义,比如,自定义一个带有可变参数name的方法:
-(void)myName:(NSString*)myName classMates:(NSString*)name,...NS_REQUIRES_NIL_TERMINATION;
从此自定义的方法可以看出,普通的参数可可选参数的区别,可选参数的格式:
(可选参数类型)可选参数名,...NS_REQUIRES_NIL_TERMINATION
3.可选参数的处理
现在我们需要调用这个自定义的方法,那么当我们拿到这个参数之后我们应该怎么获得到此参数的所有值呢?
方法实现:
-(void)myName:(NSString*)myName classMates:(NSString*)name,...NS_REQUIRES_NIL_TERMINATION
{
//创建一个数组,将可变参数的所有值存入此数组
NSMutableArray*names = [NSMutableArray array];
[names addObject:myName];
//定义一个指向可变参数的指针列表
va_list �ap ;
//判断可变参数的结束的标志
id predicate ;
//如果可变参数存在
if(name){
[names addObject:name];
va_start(ap, name);
while((predicate = va_arg(ap,id))){
//返回参数列表中指针arg_ptr所指的参数,返回类型为type,并使指针arg_ptr指向参数列表中下一个参数
[names addObject:predicate];
}
va_end(ap);
}
NSLog(@"-----------%@",names);
}
4.自定义方法调用测试:
[self myName:@"Jane"classMates:@"Kangkang",@"gods",@"Marie",@"Peter",@"Jake",nil];
输出结果是:
result5.几个重要的宏定义:
va_list :是一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行。
va_start(ap, param):对ap 进行初始化,让它指向可变参数表里面的第一个参数,第一个参数是 ap 本身,第二个参数是在变参表前面紧挨着的一个变量,即“...”之前的那个参数;
va_arg(ap, type):获取参数,它的第一个参数是ap,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把 ap 的位置指向变参表的下一个变量位置;
va_end(ap):获取所有的参数之后,我们有必要将这个 ap 指针关掉,以免发生危险,他是输入的参数 ap ,置为 NULL,应该养成获取完参数表之后关闭指针的习惯。说白了,就是让我们的程序具有健壮性。通常va_start和va_end是成对出现。
网友评论