高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1405
Variable arguments in Objective-C methods

Q:NSString の +stringWithFormat: のように、任意の数の引数を受け取るメソッドを書くにはどうすればいいのでしょうか。

A:可変の引数を取るメソッドは、可変引数(variadic)メソッドとして知られています。

Objective-C におけるメソッドの実装は、C 関数のようにコードのブロックにすぎないことに留意してください。stdarg(3) の man ページで説明している可変引数マクロは、メソッドの中で、通常の関数における場合と同じように機能します。

以下の例は、引数のゼロ終端リストにあるすべてのオブジェクトを NSMutableArray インスタンスに追加する可変引数メソッドを含む Objective-C カテゴリを示します。

リスト 1:典型的な可変引数メソッド

#import <Cocoa/Cocoa.h>

@interface NSMutableArray (variadicMethodExample)

- (void) appendObjects:(id) firstObject, ...;  // このメソッドはオブジェクトのゼロ終端リストを受け取る。

@end

@implementation NSMutableArray (variadicMethodExample)

- (void) appendObjects:(id) firstObject, ...
  {
  id eachObject;
  va_list argumentList;
  if (firstObject)                    // 最初の引数は varargs リストの一部ではないので、
  {                                   // 別個に処理する。
  [self addObject:firstObject];
  va_start(argumentList, firstObject);        // firstObject 以降の引数のスキャンを開始する。
while (eachObject = va_arg(argumentList, id)) // nil でない "id" タイプの引数を取得できるかぎり、
  [self addObject: eachObject];               // それを self の内容に追加する。
  va_end(argumentList);
  }
}

@end

va_list 型と、va_start()va_arg()、および va_end() マクロの詳細については、stdarg(3) のマニュアルページを参照してください。

ドキュメントの改訂履歴

日付 メモ
2005-01-13 初版

掲載日: 2005-01-13