为什么Apple的闭包声明缺少参数标签

问题描述:

在阅读 UIKit 时,大多数时候我看到闭包(作为函数参数)缺少这样的参数标签: func fooClosure(fooClosure:(Bool)-> Swift.Void)

As I read through the UIKit, most of the time I see closures (as a function parameter) with missing argument labels like this: func fooClosure(fooClosure: (Bool) -> Swift.Void)

在某些情况下,我

看一下 UIActivityViewController 的闭包之一(作为类型别名):

Take a look at one of UIActivityViewController's closure (as a type alias):

public typealias UIActivityViewControllerCompletionWithItemsHandler = (UIActivityType?, Bool, [Any]?, Error?) -> Swift.Void

3rd 类型代表什么?我必须查看代码的 Objective-C 版本,才能知道这些是 returnedItems

What does 3rd type stand for? I have to look at the Objective-C version of the code to know these are returnedItems.

为什么不这样实现:(请注意 activityItems 标签)

Why it is not implemented that way: (note the activityItems label)

public typealias UIActivityViewControllerCompletionWithItemsHandler = (UIActivityType?, Bool, _ activityItems: [Any]?, Error?) -> Swift.Void

编辑:
-是这只是一个临时状态(因为Swift尚未完全集成到这些框架中)?
没有参数标签的代码可读性较低。

问题是这是一个函数签名机器生成的typealias,机器没有按照您的意愿执行操作。考虑下面的Objective-C声明:

The problem is that this is a function signature typealias generated by machine, and the machine isn't doing what you would like it to do. Consider the following Objective-C declaration:

typedef void (^MyCoolType)(NSString* __nullable name);

Swift生成的界面是:

The Swift generated interface for that is:

public typealias MyCoolType = (String?) -> Swift.Void

如您所见,名称被剥夺;

在Swift中,没有什么可以阻止 you 定义带有内部标签的函数签名类型别名的。这是合法的:

Nothing stops you from defining a function signature typealias with internal labels, in Swift. This is legal:

public typealias MyCoolType = (_ name:String?) -> Void

但这并不是从Objective-C生成生成接口的方式。

But that does not happen to be how the generated interface is generated from Objective-C.