당신은 할 수 없습니다. 생성 된 코드는 어떻게 한 인수 목록이 끝나고 다음 인수가 시작되는지를 어떻게 알 수 있습니까? C 상당을 생각해보십시오.
void insertInTableOnAtributes(id fieldNames, ..., id fieldValues, ...);
컴파일러는 같은 이유로 그것을 거부합니다.
두 가지 합리적인 옵션이 있습니다. 첫 번째 방법은 대신 NSArray
초 걸리는 메서드를 제공하는 것입니다.
는
- (void)insertInTableOnAttributes:(NSArray *)fieldNames values:(NSArray *)fieldValues;
번째이 하나
[obj insertInTableOnAttributes:@"firstName", @"firstValue", @"secondName", @"secondValue", nil];
는 C와 유사 같이 사용될 것이다 +[NSDictionary dictionaryWithObjectsAndKeys:]
- (void)insertInTableOnAttributes:(id)fieldName, ...;
유사한 하나의 이름 - 값 쌍의 가변 인자를 사용하는 것이다 사실 꽤 정확합니다. 의 Obj-C의 방법은 그래서 C 방식의 상단에 문법 설탕, 기본적으로
- (void)foo:(int)x bar:(NSString *)y;
그것을 제외하고
void foobar(id self, SEL _cmd, int x, NSString *y);
실제로 실제 이름이없는 것처럼 보이는 C의 방법으로 백업 . 이 C 함수는 메서드의 IMP
이라고하며 obj-c 런타임 메서드를 사용하여이 함수를 검색 할 수 있습니다. 가변 인자 후 인수를 갖는 귀하의 경우에는
, 당신의
- (void)someMethodWithArgs:(id)anArg, ... andMore:(id)somethingElse;
이
void someMethodWithArgsAndMore(id anArg, ..., id somethingElse);
처럼 보이는 당신은 가변 인자 후 인수를 가질 수 없습니다 년부터 IMP
에 의해 뒷받침 될 것이다,이 단순히 작동하지 않습니다.
컴파일러는 한 목록이 끝나는 곳과 정규 인수가 명명 된 인수의 배치로 시작하는 위치를 잠재적으로 알 수 있기 때문에 C 유추가 올바르지 않습니다. – dasblinkenlight
@ dasblinkenlight : 아니요, 실제로 사실 그대로입니다. Obj-C 메소드는 기본적으로 C 메소드의 위에있는 구문 론적 설탕입니다. 나는 설명 할 나의 포스트를 업데이트 할 것이다. –
글쎄, 나는 마지막 항목 뒤에 공백이 있다고 가정하고 (nil)이 문제를 해결할 것이다. 하지만 나는 "C"방식을 보지 못했습니다. – user1522449