2014-12-23 3 views
0

I 현재 작동하고 다음을 가지고 :명명 된 중첩 블록 매개 변수는 어떻게 선언합니까?

typedef BOOL(^InnerBlockType)(int arg1, int arg2); 

- (BOOL)doStuff:(void(^)(InnerBlockType innerBlock))block; 

하지만 인수가 쉽게 사용할 수 있도록, 자동 완성 후에 볼 수 있도록 형식 정의를 제거하고 블록 인라인을하고 싶습니다. 그래도 구문을 올바르게 가져올 수 없습니다. 나는 그곳에 99 %를 얻을 수 있지만 그 블록에 이름을 부여하는 것을 포함하지는 않습니다. 식별자를 삽입하면 Xcode에서 )이 필요하다고 알려줍니다.

// Compiles, but is missing the inner block's name 
- (BOOL)doStuff:(void(^)(BOOL(^)(int arg1, int arg2)))block; 

// This is what I'd like 
- (BOOL)doStuff:(void(^)(BOOL(^)(int arg1, int arg2))innerBlock)block; 
// But I get a compiler error here:    ^ Expected ')' 

나는에 다른 모든 다른 괄호 조합 밖으로 innerBlock 식별자를 이동하려고했습니다,하지만 난 같은 오류가 발생합니다. 컴파일러를 만족시키는 innerBlock 식별자를 어디에 삽입 할 수 있습니까?

답변

2

이름 제거

- (BOOL)doStuff:(void(^)(BOOL(^)(int arg1, int arg2)))block; 

또는 전통적라는 이름의 블록처럼 삽입 :

- (BOOL)doStuff:(void(^)(BOOL(^innerBlock)(int arg1, int arg2)))block; 

나는 통지 자동 완성이 나에게 거친 시간을주고 있었다했고, 그것은하는 것 같지 않았어요,하지만 그것을 잘 받아 들여라. 결과는 다음과 같습니다.

[self doStuff:^(BOOL (^innerBlockType)(int arg1, int arg2)) { 
    // 
}]; 
+0

우리는 동시에 답변을 입력했습니다! 추가 파고가 당신이 제공 한 두 번째 것이 나타났습니다. 나는 지금 내 것을 삭제했다. 감사! – Dov

+0

@Dov - 문제 없음 :) – Logan

+0

동의, 자동 완성은 펑키입니다. 나는 그것을 애플에보고했다. – Dov