2012年11月19日 星期一

Objective-C 如 printf() 或是 NSLog() 不定參數的寫法


參考
http://www.numbergrinder.com/2008/12/variable-arguments-varargs-in-objective-c/

準備 interface
 
@interface Car : NSObject {
}
-(void)addCars:(NSString * ) title, ... ;

@end
 


addCars: 這個 method 有一個 NSString 的參數,第二個參數是 ...

也就是 variable arguments 重要語法

先要確定 addCars: 怎麼用

我們假設是如下使用

[car addCars:@"Toyota", @"Honda", @"BMW", nil ];


可以輸入多個 NSString 但是要 nil 結束。
再來就是 implementation
 
@implementation Car
-(void) addCars:(NSString *)title, ...{

 va_list args;
 va_start(args, title);
 NSLog(@"%@", title);

 NSString * car;
 while ((car = va_arg(args, NSString *))) {

  NSLog(@"%@",car);
 }
 va_end(args);
}

@end
 

在上方的 addCars: 裡我們用到了

va_list 這個型別,用來代表 ... 的所有內容

用 args 指向 ... 的內容

再來看到 va_start(args, title)

明確告知 args 放的內容是 title 之後的內容

然後把每一個 args 都用 NSString * 來表示, 轉型成 NSString *

用 car = va_arg(args, NSString *) 把位置給 car 變數

到 car 是 nil 為止,所以用 while

最後是用 va_end(args); 結尾。


在 main 就可以如下輸入
 
Car * obj = [Car new];

[obj addCars:@"Toyota",@"Honda",@"Benz",@"BMW",nil];
 
Console 結果是

Toyota
Honda
Benz
BMW

用 nil 結尾主要是可以知道 ... 何時結束

也可以用參考提到的,

第一個參數是數字如下


- (NSNumber *) addValues:(NSNumber *) firstNumber, …


就交給大家試試了