0

メソッドで複数の変数 Args を受け取る必要があります。しかし、私はそうする方法がわかりません。

例えば:

(void)insertInTableOnAttributes:(id)fieldsNames, ... Values:(id)fieldsValues, ...;

(...)悲しいことに、最初の発言の後にコンパイラ エラーが表示されます。

Expected ':' after method Prototype".

そして、実装では次のように述べています。

Expected Method Body" in the same position (just after the first ...)

PD: Xcode 4.2.1 を使用しています。

4

2 に答える 2

5

そんなことはできません。生成されたコードは、1 つの引数リストがどこで終わり、次の引数リストがどこで始まるかをどのように知るのでしょうか? C に相当するものを考えてみてください

void insertInTableOnAtributes(id fieldNames, ..., id fieldValues, ...);

コンパイラは同じ理由でそれを拒否します。

合理的な選択肢が 2 つあります。NSArray1 つ目は、代わりに 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 の後には引数を指定できないため、これは単純に機能しません。

于 2012-07-13T02:59:17.750 に答える
0
- (void)insertInTableOnAttributes:(NSArray *)fieldsNames values:(NSArray *)fieldsValues;

// 使用する

[self insertInTableOnAttributes:[NSArray arrayWithObject:@"name", nil] values:[NSArray arrayWithObject:@"value", nil]];
于 2012-07-13T02:59:08.703 に答える