ios開發-Object-C可變參數函數

來源:互聯網
上載者:User

標籤:

簡介

一個可變參數函數是指一個函數擁有不定的參數,即為一個函數可接收多個參數。有時我們會遇到一些算術問題需要用到,比如是計算傳入參數的總和,字串的串連或是其它操作過程,我們在 OC 裡也經常使用,最經典的就是 NSLog( C 為 printf ) ,它可以指定格式的輸出,格式化輸出的內容。

 

現在我們先來看看普通函數的定義方法。

 

 

普通函數

一般我們定義的函數都是指定有多少個參數,如果是有三個參數,我們可以這樣寫。

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

這樣有一個問題,如果我們需要計算值,比如需要計算5個或10個數值相加的運行,那我們在函數裡是不是需要定義5個或10個的參數?如果有100個數值需要計算 …… 。

 

 

可變參數函數

現在,我們可以通過定義 可變參數函數 去實現剛剛的問題,比如我們現在需要傳進來參數的數值之和,而且傳的參數個數是不固定的。可變參數函數的定義方法很簡單,我們在參數的後面加上 ", ..."就可以了,例如。

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

 

現在,我們回到剛剛的難題,這個函數主要是用來計算使用者傳進來的數值之和。

- (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/

本文著作權歸作者和部落格園共有,歡迎轉載,但須保留此段聲明,並給出原文連結,謝謝合作!

 

ios開發-Object-C可變參數函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.