2014-10-20 1 views
0

블록에 매개 변수 배열을 동적으로 적용하는 방법이 필요합니다. 블록에는 모든 유형의 매개 변수가 여러 개있을 수 있습니다.블록에 매개 변수 배열을 동적으로 적용하기

배열의 매개 변수 개수와 유형이 일치한다는 것을 알고 있습니다.

나는 블록을 CTBlockLiteral으로 주조하는 것을 이미 보았습니다. 이렇게하면 invoke 메소드에 액세스 할 수 있습니다.

(void(^)(NSString* arg0,NSString* arg1))의 블록은 blockRef->invoke(nil, @"foo", @"bar");과 같이 호출 할 수 있습니다.

컴파일 타임에 유형과 유형을 알 수없는 매개 변수의 수를 어떻게 일반화 할 수 있습니까?

편집 : 명확히 말하면, 블록을 변경하여 varargs, 배열 등을 허용하지 않습니다. 이 블록은 원하는 서명을 가질 수 있으며 배열에 매개 변수가 있습니다. 이러한 매개 변수를 블록에 어떻게 전달할 수 있습니까? Javascript의 apply 함수와 비슷한 것을 원하는 것처럼 느껴집니다.

+0

var args? https://gist.github.com/JacobOscarson/2783763 –

+0

@GuillaumeAlgis 아니요, 블록은 이런 일이 일어난 것을 기쁜 마음으로 알아야합니다. – funkybro

+0

Objective-C의 블록에 Javascript의'apply' 함수를 어떻게 재현합니까?라는 질문을하는 것 같습니다. " 블록은 이에 적합하지 않습니다. 아마도'NSInvocation', 당신이하려는 일에 달려 있습니다. 해결하고자하는 더 광범위한 비즈니스 문제를 기술 할 수 있습니까? – Rob

답변

0

1) 데이터를 캡슐화하는 객체를 전달 또한 C 2 가변 인자라는 줄임표) 매개 변수 3로 사전/수집 전달)를 사용을 할 수있는 몇 가지 방법이 있습니다.

(void(^)(id allMyArgs)) { 
    NSArray *args = (NSArray *)allMyArgs; 
    ... 
} 

이 같은 호출 가능 정의 블록

NSArray *aux = @[ arg1, arg2, ... argN ]; 
NSString *par = (NSString *)aux; 

blockRef->invoke(nil, par, @"bar"); 

및 액세스 :

NSArray *aux = @[ arg1, arg2, ... argN ]; 
blockRef->invoke(nil, aux); 

어레이에 대한 포인터를 전달하기 위해 포인터 인수를 사용하여 서명을 변경하지 않고 매개 변수

(void(^)(NSString* arg0,NSString* arg1)) { 

    NSArray *pars = (NSArray*)args0; 

    ... 
} 
+0

맞아, 이건 내가 필요로하는 것이 아니다. 내 블록은 다음과 같이 보일 수 있습니다. (void (^) (NSString * arg0, int arg1)) {}' arg3)) {}', 상관 없어. 내가하고 싶은 것은 그것에 논쟁을 적용하는 것뿐입니다. – funkybro

+0

그럴 경우 https://developer.apple.com/library/mac/qa/qa1405/_index.html – Joao

+0

에 설명 된대로 줄임표를 사용하십시오. 필자는 이것이 내가 필요한 것이라고 생각하지 않습니다. 블록의 서명을 변경하지 않고 줄임표를 사용하여'(void (^) (NSString * arg0, int arg1)) {}'서명이있는 블록을 호출하는 방법을 보여줄 수 있습니까? – funkybro