そんなことはできません。生成されたコードは、1 つの引数リストがどこで終わり、次の引数リストがどこで始まるかをどのように知るのでしょうか? C に相当するものを考えてみてください
void insertInTableOnAtributes(id fieldNames, ..., id fieldValues, ...);
コンパイラは同じ理由でそれを拒否します。
合理的な選択肢が 2 つあります。NSArray
1 つ目は、代わりに sを取るメソッドを提供することです。
- (void)insertInTableOnAttributes:(NSArray *)fieldNames values:(NSArray *)fieldValues;
2 つ目は、次のように、名前と値のペアで 1 つの可変引数を使用することです。+[NSDictionary dictionaryWithObjectsAndKeys:]
- (void)insertInTableOnAttributes:(id)fieldName, ...;
これは次のように使用されます
[obj insertInTableOnAttributes:@"firstName", @"firstValue", @"secondName", @"secondValue", nil];
C の類推は、実際には非常に正確です。Obj-C メソッドは、基本的に C メソッドの上にシンタックス シュガーがあるため、
- (void)foo:(int)x bar:(NSString *)y;
次のようなCメソッドに支えられています
void foobar(id self, SEL _cmd, int x, NSString *y);
ただし、実際には本名はありません。この C 関数はIMP
メソッドの と呼ばれ、obj-c ランタイム メソッドを使用して取得できます。
varargs の後に引数を持つ場合、あなたの
- (void)someMethodWithArgs:(id)anArg, ... andMore:(id)somethingElse;
次のようIMP
な
void someMethodWithArgsAndMore(id anArg, ..., id somethingElse);
varargs の後には引数を指定できないため、これは単純に機能しません。