iOS實現傳遞不定長的多個參數


我們在使用蘋果官方的文檔的時候會發現可傳不定數的參數例如:

//    [[UIAlertView alloc]initWithTitle:<#(nullable NSString *)#> message:<#(nullable NSString *)#> delegate:<#(nullable id)#> cancelButtonTitle:<#(nullable NSString *)#> otherButtonTitles:<#(nullable NSString *), ...#>, nil]

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"title" message:@"message" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"other1",@"other2",@"other3", nil ];
    [alert show];

這時你會發現 最后一個參數蘋果會這樣寫 並且給你提示  ... 並以nil結尾

otherButtonTitles:<#(nullable NSString *), ...#>, nil

我們自己寫的時候怎么做到這種效果的提示呢 ? 又怎么獲取里面的參數呢?

如下我們自己寫一個這樣的方法並獲取參數

- (void)viewDidLoad {
    [super viewDidLoad];
    [self testParams:@"title" addMoreParams:@"other1",@"other2", @"other3",nil];

}

 

/*iOS實現傳遞不定長的多個參數的方法是使用va_list。va_list是C語言提供的處理變長參數的一種方法。在調用的時候要在參 數結尾的時候加nil
    va_list的使用需要注意:
        1.首先在函數里定義va_list型的變量,這個變量是指向參數的指針;
        2.然后用va_start初始化剛定義的va_list變量;
        3.然后用va_arg返回可變的參數,va_arg的第二個參數是你要返回的參數的類型.如果函數有多個可變參數的,依次調用va_arg獲取各個參數;
        4.最后用va_end宏結束可變參數的獲取
        
        NS_REQUIRES_NIL_TERMINATION,是一個宏,用於編譯時非nil結尾的檢查。 調用時要以nil結尾,否則會崩潰。
 
 */
- (void)testParams:(NSString *)title addMoreParams:(NSString *)string, ...NS_REQUIRES_NIL_TERMINATION {
    
    NSLog(@"傳多個參數的第一個參數 %@",string);//是other1
    
    //1.定義一個指向個數可變的參數列表指針;
    va_list args;
    
    //2.va_start(args, str);string為第一個參數,也就是最右邊的已知參數,這里就是獲取第一個可選參數的地址.使參數列表指針指向函數參數列表中的第一個可選參數,函數參數列表中參數在內存中的順序與函數聲明時的順序是一致的。
    va_start(args, string);
    
    if (string)
    {
        //依次取得除第一個參數以外的參數
        //4.va_arg(args,NSString):返回參數列表中指針所指的參數,返回類型為NSString,並使參數指針指向參數列表中下一個參數。
        while (va_arg(args, NSString *))
        {
            NSString *otherString = va_arg(args, NSString *);
            NSLog(@"otherString %@",otherString);
        }
    }
    //5.清空參數列表,並置參數指針args無效。
    va_end(args);
    
}

 

所以






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM