Cocoa 框架大量使用可變參數方法(如 initWithFormat:、UIAlertView 初始化)。自定義類同樣可通過 va_list 實現靈活的參數列表。
, ... 結尾。id)。nil 結尾作為哨兵。@interface Man : NSObject
- (NSString *)makeMilk:(NSString *)milk fruit:(NSString *)fruit food:(NSString *)food, ...;
@end
@implementation Man
- (NSString *)makeMilk:(NSString *)milk fruit:(NSString *)fruit food:(NSString *)food, ... {
NSMutableArray *arr = [NSMutableArray array];
if (food) {
va_list params;
va_start(params, food); // 從 food 之後開始
id argument;
while ((argument = va_arg(params, id))) { // nil 結束
[arr addObject:argument];
}
va_end(params);
}
return [NSString stringWithFormat:@"%@_%@_%@", milk, fruit, [arr componentsJoinedByString:@"_"]];
}
@end
Man *man = [[Man alloc] init]; NSString *result = [man makeMilk:@"馬奶" fruit:@"蘋果" food:@"魚兒", @"肉兒", @"雞兒", @"鴨兒", @"鵝兒", nil]; // 結果:馬奶_蘋果_魚兒_肉兒_雞兒_鴨兒_鵝兒
va_list:指向可變參數列表的不透明指針。va_start(ap, lastFixed):初始化 ap 指向第一個可變參數。va_arg(ap, type):取出當前參數並移動到下一個。va_end(ap):清理資源(某些架構需調整棧指針)。arrayWithObjects:)掌握 va_list 可讓你設計出極具表達力的 Objective-C API,貼合 Cocoa 風格。