2009-07-26 21 views
1

私はオプションの引数を持つ指定された初期化子を持っています(次のコードに似ています)、それを呼び出すことによって自動解放メソッドを作成したいと思います。これを行う方法はありますか?オプションの引数を別の関数/メソッドに送る方法は?

@interface MyObject : NSObject 

- (id)initWithArgs:(id)firstArg, ...; 
+ (id)objectWithArgs:(id)firstArg, ...; 

@end 

@implementation MyObject 

- (id)initWithArgs:(id)firstArg, ... 
{ 
    if (!firstArg || ![super init]) { 
     return nil 
    } 

    va_list argList; 
    va_start(argList, firstArg); 

    id currentObject = firstArg; 
    do { 
     NSLog(@"%@", currentObject); 
    } while ((currentObject = va_arg(argList, id)) != nil); 

    va_end(argList); 
    return self; 
} 

+ (id)objectWithArgs:(id)firstArg, ... 
{ 
    // return [[[MyObject alloc] initWithArgs:firstArg, ...] autorelease]; 
} 

@end 
+0

次回サイトを検索最初に、これのための重複のトンがあります。 –

答えて

6

あなたはできません。 comp.lang.c FAQを参照してください。あなたができる最も近いことは、関数の2つのバージョンを作成することです。一つはvarargs(...)をとり、もう一つはva_listです。可変引数のバージョンが重複したコードを避けるためにva_listバージョンに仕事をオフに渡すことができます。

@interface MyObject : NSObject 

- (id)initWithArgs:(id)firstArg, ...; 
- (id)init:(id)firstArg withVaList:(va_list)args; 
+ (id)objectWithArgs:(id)firstArg, ...; 
+ (id)object:(id)firstArg withVaList:(va_list)args; 

@end 

@implementation MyObject 

- (id)initWithArgs:(id)firstArg, ... 
{ 
    va_list args; 
    va_start(args, firstArg); 
    id result = [self init:firstArg withVaList:args]; 
    va_end(args); 
    return result; 
} 

- (id)init:(id)firstArg withVaList:(va_list)args 
{ 
    // do actual init here: 
    while((id arg = va_arg(args, id))) 
    { 
     // ... 
    } 
} 

+ (id)objectWithArgs:(id)firstArg, ... 
{ 
    va_list args; 
    va_start(args, firstArg); 
    id result = [MyObject object:firstArg withVaList:args]; 
    va_end(args); 
    return result; 
} 

+ (id)object:(id)firstArg withVaList:(va_list)args 
{ 
    return [[[MyObject alloc] init:firstArg withVaList:args] autorelease]; 
} 

@end 
+0

どのようにすればよい - (id)initWithVaList:(va_list)argsに対してargsを反復するか? これは私が試みたものです。 id:eachObject; ; while(eachObject = va_arg(args、id)) 結果は、私がこれを行うときに、最初の引数がwhileループで見つからないということです。 – hfossli

3

メソッドのオーバーロードを持つ言語にデフォルト引数を行うための通常の方法は次のとおりです。


function foo(bar, baz) { 
    ... actual function code here ... 
} 

function foo(bar) { 
    foo(bar, 42) 
} 
+0

良い解決策。悪いCにはオプションの引数はありません。 – Eugene

関連する問題