objective-c - Objective C block - 语法

标签 objective-c objective-c-blocks

我有一个如下定义的 block :

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)之后?为什么如此口是心非?我一定错过了一些明显的东西。

最佳答案

人们通常 typedef 任何重要的 block ,这使得这几乎不是问题:

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

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

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

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

据我所知,这并不存在。

关于objective-c - Objective C block - 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14955577/

相关文章:

ios - 透明本地通知/回调

iphone - 在 Xcode 中项目构建的链接阶段出现重复符号问题

iphone - 如何在选项卡 View Controller Storyboard应用程序中添加更多选项卡?

ios - 未找到框架 MicrosoftBandKit_iOS

objective-c - Obj C 中的 block 比较器如何工作?

ios - CoreData 和预加载 sqlite

Objective-C:是否有对带参数的 block 的调用?

ios - 从delphi调用 objective-c 代码块

iphone - 使用 block 将NSDictionary转换为字符串?

objective-c - 是否可以使用不同的参数类型覆盖 NSOperation 的completionBlock 属性?