2

私はこのように定義されたブロックを持っています:

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)名前付き引数すべてのリストが数文字後にあるのに、なぜ世界で書かなければならないのかを尋ねたいのですが。なぜそのような重複?明らかな何かが欠けているに違いありません。

4

2 に答える 2

3

人々は通常、重要なブロックをtypedefします。これにより、これはほとんど問題になりません。

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

その後:

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

typedefは、コードの可読性の観点からも望ましいものです。また、宣言と定義の署名は完全に同じである必要はありません。

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

これは、まったく同じものを2回繰り返さないことを意味し、実際のブロック定義でわずかに異なるタイプを選択する可能性が便利な場合があります。

ある種の型推論があればいいのにと思います。

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

私の知る限り、これは存在しません。

于 2013-02-19T11:02:10.737 に答える
0

ブロックの構文は主にC関数ポインターの構文に基づいてモデル化されているため、おそらくその世界で理論的根拠を探す必要があります。

于 2013-02-19T10:58:12.780 に答える