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

你不能那样做。生成的代码如何可能知道一个参数列表在哪里结束,下一个从哪里开始?试着想想 C 的等价物

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

出于同样的原因,编译器会拒绝它。

你有两个合理的选择。第一个是提供一个以NSArrays 代替的方法。

- (void)insertInTableOnAttributes:(NSArray *)fieldNames values:(NSArray *)fieldValues;

第二种是使用一个带有名称-值对的可变参数,类似于+[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);

并且由于在可变参数之后不能有任何参数,所以这根本行不通。

于 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 回答