2013-02-19 24 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 2013-02-19 10:52:13

回答

3

人們通常的typedef任何非平凡塊,這使得這個幾乎不成問題:

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

然後:

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

的類型定義也從代碼的可讀性的觀點,期望。此外,在聲明和定義簽名不必完全相同:

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

這意味着,你不重複一模一樣的東西,兩次的可能性,選擇一個稍微不同類型的實際的塊定義有時很方便。

我同意這將是很好有某種類型推斷:

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

這並不存在,因爲據我所知。

+0

優秀的解釋!非常感謝。 – 2013-02-19 11:07:16

0

塊的語法大部分是基於C函數指針的語法建模的,因此您應該查找該世界的基本原理。