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) {…};

这意味着您不会重复两次完全相同的内容,并且在实际块定义中选择稍微不同类型的可能性有时很方便。

我同意进行某种类型推断会很好:

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

据我所知,这不存在。

于 2013-02-19T11:02:10.737 回答
0

块的语法很大程度上模仿了 C 函数指针的语法,因此您可能应该在那个世界中寻找基本原理。

于 2013-02-19T10:58:12.780 回答