1.什么是多選參數(shù)?
如果你做過(guò)iOS開(kāi)發(fā),你肯定遇到過(guò)下面這樣的方法:
- (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;
此時(shí)你可能注意到了,參數(shù)otherButtonTitles和參數(shù)firstObj都可以傳遞很多值,并且是以關(guān)鍵字nil結(jié)束,這就是多選參數(shù)。
2.多選參數(shù)的用法
如果在項(xiàng)目中你需要自定義一個(gè)帶有可變參數(shù)的方法,那么我們可以仿照上面的例子自定義,比如,自定義一個(gè)帶有可變參數(shù)name的方法:
-(void)myName:(NSString*)myName classMates:(NSString*)name,...NS_REQUIRES_NIL_TERMINATION;
從此自定義的方法可以看出,普通的參數(shù)可可選參數(shù)的區(qū)別,可選參數(shù)的格式:
(可選參數(shù)類型)可選參數(shù)名,...NS_REQUIRES_NIL_TERMINATION
3.可選參數(shù)的處理
現(xiàn)在我們需要調(diào)用這個(gè)自定義的方法,那么當(dāng)我們拿到這個(gè)參數(shù)之后我們應(yīng)該怎么獲得到此參數(shù)的所有值呢?
方法實(shí)現(xiàn):
-(void)myName:(NSString*)myName classMates:(NSString*)name,...NS_REQUIRES_NIL_TERMINATION
{
//創(chuàng)建一個(gè)數(shù)組,將可變參數(shù)的所有值存入此數(shù)組
NSMutableArray*names = [NSMutableArray array];
[names addObject:myName];
//定義一個(gè)指向可變參數(shù)的指針列表
va_list ?ap ;
//判斷可變參數(shù)的結(jié)束的標(biāo)志
id predicate ;
//如果可變參數(shù)存在
if(name){
[names addObject:name];
va_start(ap, name);
while((predicate = va_arg(ap,id))){
//返回參數(shù)列表中指針arg_ptr所指的參數(shù),返回類型為type,并使指針arg_ptr指向參數(shù)列表中下一個(gè)參數(shù)
[names addObject:predicate];
}
va_end(ap);
}
NSLog(@"-----------%@",names);
}
4.自定義方法調(diào)用測(cè)試:
[self myName:@"Jane"classMates:@"Kangkang",@"gods",@"Marie",@"Peter",@"Jake",nil];
輸出結(jié)果是:
5.幾個(gè)重要的宏定義:
va_list :是一個(gè)字符指針,可以理解為指向當(dāng)前參數(shù)的一個(gè)指針,取參必須通過(guò)這個(gè)指針進(jìn)行。
va_start(ap, param):對(duì)ap 進(jìn)行初始化,讓它指向可變參數(shù)表里面的第一個(gè)參數(shù),第一個(gè)參數(shù)是 ap 本身,第二個(gè)參數(shù)是在變參表前面緊挨著的一個(gè)變量,即“...”之前的那個(gè)參數(shù);
va_arg(ap, type):獲取參數(shù),它的第一個(gè)參數(shù)是ap,第二個(gè)參數(shù)是要獲取的參數(shù)的指定類型,然后返回這個(gè)指定類型的值,并且把 ap 的位置指向變參表的下一個(gè)變量位置;
va_end(ap):獲取所有的參數(shù)之后,我們有必要將這個(gè) ap 指針關(guān)掉,以免發(fā)生危險(xiǎn),他是輸入的參數(shù) ap ,置為 NULL,應(yīng)該養(yǎng)成獲取完參數(shù)表之后關(guān)閉指針的習(xí)慣。說(shuō)白了,就是讓我們的程序具有健壯性。通常va_start和va_end是成對(duì)出現(xiàn)。