Create a wrapper for every possible number of arguments:
void k1(int x, const char *param1) {
k(x, param1);
}
void k2(int x, const char *param1, const char *param2) {
k(x, param1, param2);
}
void k3(int x, const char *param1, const char *param2, const char *param3) {
k(x, param1, param2, param3);
}
This is likely your only option but you can make it more generic...
We can create a function taking va_list
, count the arguments and call the specific k1
, k2
, etc. variant, to provide a "nicer" API for Swift:
void genericK(int x, va_list params) {
const char * paramArray[10];
int numParams = 0;
NSString* arg = nil;
while ((arg = va_arg(params, NSString *))) {
paramArray[numParams++] = [arg cStringUsingEncoding:[NSString defaultCStringEncoding]];
}
switch (numParams) {
case 1:
k(x, paramArray[0], NULL);
break;
case 2:
k(x, paramArray[0], paramArray[1], NULL);
break;
case 3:
k(x, paramArray[0], paramArray[1], paramArray[2], NULL);
break;
default:
assert(false);
}
}
Then you can create another wrapper in Swift, that takes variable number of arguments again:
func k(_ x: Int32, _ params: String...) {
withVaList(params) {
genericK(x, $0)
}
}
k(0, "testA", "testB", "testC")
The solution has one problem - you are limiting the number or arguments to a fixed number. That shouldn't be a big problem though...