2013-02-19 4 views
2

이 같은 블록을 정의 :목표 C 블록 - 구문

CGPoint (^rotateOrderedPair)(CGFloat, CGFloat, CGFloat, CGFloat, CGFloat) = ^(CGFloat x, CGFloat y, CGFloat pivotX, CGFloat pivotY, CGFloat angle) { 
    CGFloat rotatedX = cos(angle) * (x - pivotX) - sin(angle) * (y - pivotY) + pivotX; 
    CGFloat rotatedY = sin(angle) * (x - pivotX) + cos(angle) * (y - pivotY) + pivotY; 
    return CGPointMake(rotatedX, rotatedY); 
}; 

내가 물어보고 싶은 이유는 세계에서 나는 모든 명명 된 인수 목록 만이있을 때 (CGFloat, CGFloat, CGFloat, CGFloat, CGFloat)를 작성해야 할 몇 자 후에 요? 그런 이중성은 왜 존재합니까? 나는 명백한 것을 놓치고 있어야합니다.

+3

이것은 함수 포인터를 사용하는 것과는 다르지 않습니다. 지루한 것을 발견하면'typedef '를 생성하십시오. – trojanfoe

답변

3

사람들은 보통이 거의되지 않은 문제를 만드는 아닌 사소한 블록을, 형식 정의를 . 이것은 두 번 정확히 같은 물건을 반복하지 않는 및 가능성이있는 약간 다른 유형을 선택하는 것을 의미

typedef void (^SomeBlock)(NSObject*); 
SomeBlock foo = ^(id arg) {…}; 

: 또한, 선언 및 정의 서명이 정확하게 일치하지 않습니다 실제 블록 정의는 때로 편리합니다.

가 나는 형식 유추의 일종을 가지고 좋은 것입니다 동의

auto block = ^(/* a complex signature*/) {…}; 

이것은 내가 아는 한, 존재하지 않습니다.

+0

뛰어난 설명! 고마워. –

0

블록 구문은 주로 C 함수 포인터의 구문을 모델로하므로 해당 세계의 근거를 찾아야합니다. 다음

typedef CGPoint (^XYPointTransform)(CGFloat, CGFloat, CGFloat, CGFloat, CGFloat); 

그리고 :

XYPointTransform rotateOrderedPair = 
    ^(CGFloat x, CGFloat y, CGFloat pivotX, CGFloat pivotY, CGFloat angle) { 
    // … 
}); 

typedef입니다 또한 코드의 가독성의 관점에서 바람직하다