2012-07-13 5 views
0

내 메서드에서 둘 이상의 변수 Args를 받아야합니다. 그러나 나는 그렇게하는 법을 모른다. 예를 들어ObjC 메서드에서 둘 이상의 변수 Arg을 전달하는 방법은 무엇입니까?

는 :

Expected ':' after method Prototype". 

그리고 구현에

는 말한다 :

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

PD를 :

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

슬프게도이 말을 처음 (...) 후 컴파일러 오류가 나타납니다 내가 ' Xcode를 사용하여 m 4.2.1.

답변

5

당신은 할 수 없습니다. 생성 된 코드는 어떻게 한 인수 목록이 끝나고 다음 인수가 시작되는지를 어떻게 알 수 있습니까? 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에 의해 뒷받침 될 것이다,이 단순히 작동하지 않습니다.

+0

컴파일러는 한 목록이 끝나는 곳과 정규 인수가 명명 된 인수의 배치로 시작하는 위치를 잠재적으로 알 수 있기 때문에 C 유추가 올바르지 않습니다. – dasblinkenlight

+0

@ dasblinkenlight : 아니요, 실제로 사실 그대로입니다. Obj-C 메소드는 기본적으로 C 메소드의 위에있는 구문 론적 설탕입니다. 나는 설명 할 나의 포스트를 업데이트 할 것이다. –

+0

글쎄, 나는 마지막 항목 뒤에 공백이 있다고 가정하고 (nil)이 문제를 해결할 것이다. 하지만 나는 "C"방식을 보지 못했습니다. – user1522449

0
- (void)insertInTableOnAttributes:(NSArray *)fieldsNames values:(NSArray *)fieldsValues; 

// 사용

[self insertInTableOnAttributes:[NSArray arrayWithObject:@"name", nil] values:[NSArray arrayWithObject:@"value", nil]]; 
+0

답을 찾을 수없는 경우를 대비하여 감사합니다. 계획 B였습니다. – user1522449

관련 문제