如果在定義方法時,在最后一個形參明后增加逗號和三點(,...),則表明該形參可以接受多個參數值。
為了在程序中獲取個數可變的形參,需要使用如下關鍵字
· va_list:這是一個類型,用于定義指向可變參數列表的指針變量
· va_start:這是一個函數,該函數指定開始處理可變形參的列表,并讓指針變量指向可變形參列表的第一個參數
· va_end:結束處理可變形參,釋放指針變量
· va_arg:該函數返回獲取指針當前指向的參數的值,并將指針移動到指向下一個參數
例子
Varargs.h
#import <Foundation/Foundation.h>@interface Varargs : NSObject//定義形參個數可變的方法-(void)test:(NSString *)name,...;@end
Varargs.m
#import "Varargs.h"@implementation Varargs-(void)test:(NSString *)name,...{ // 使用va_list定義一個argList指針變量,該指針變量指向可變參數列表 va_list argList; // 如果為第一個name參數存在,才需要處理后面的參數 if (name) { // 由于name參數并不在可變參數列表中,因此先處理name參數 NSLog(@"%@" , name); // 讓argList指向第一個可變參數列表的第一個參數,開始提取可變參數列表的參數 va_start(argList, name); // va_arg用于提取argList指針當前指向的參數,并將指針移動到指向下一個參數 // arg變量用于保存當前獲取的參數,如果該參數不為nil,進入循環體 NSString* arg = va_arg(argList, id); while (arg) { // 打印出每一個參數. NSLog(@"%@",arg); // 再次提取下一個參數,并將指針移動到指向下一個參數 arg = va_arg(argList, id); } // 釋放argList指針,結束提取 va_end(argList); }}@end
main函數
int main(int argc, const char * argv[]){ @autoreleasepool { Varargs* va = [[Varargs alloc] init]; [va test:@"瘋狂iOS講義" , @"瘋狂Android講義", @"瘋狂Ajax講義" , nil]; } return 0;}
注意:個數可變的形參只能處于形參列表的最后。一個方法中最多之恩給你保吉安一個長度可變的形參。
引自《瘋狂iOS講義(上)》
新聞熱點
疑難解答