你不能那样做。生成的代码如何可能知道一个参数列表在哪里结束,下一个从哪里开始?试着想想 C 的等价物
void insertInTableOnAtributes(id fieldNames, ..., id fieldValues, ...);
出于同样的原因,编译器会拒绝它。
你有两个合理的选择。第一个是提供一个以NSArray
s 代替的方法。
- (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);
并且由于在可变参数之后不能有任何参数,所以这根本行不通。