为什么苹果的封闭声明缺less参数标签

当我通过UIKit阅读,大部分时间我看到闭包(作为一个函数参数)与缺less的参数标签是这样的: func fooClosure(fooClosure: (Bool) -> Swift.Void)

在某些情况下,我可以猜测它代表什么,在其他情况下,我不能。

例:

看一看UIActivityViewController的闭包之一(作为一个types别名):

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

第三类代表什么? 我必须看看Objective-C版本的代码,以知道这些是returnedItems

为什么没有这样实现:( 注意activityItems标签)

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

编辑:这只是一个临时的状态(因为斯威夫特尚未完全集成在这些框架呢)? 如果没有参数标签,代码的可读性会降低

问题是这是由机器生成的函数签名typealias,机器没有做你想做的事情。 考虑下面的Objective-C声明:

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

Swift生成的接口是:

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

正如你所看到的, name被剥离了。 它是无处可见的。

没有什么能阻止在Swift中定义一个带有内部标签的函数签名typealias。 这是合法的:

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

但是,这并不是如何从Objective-C生成生成的接口。

从Swift 3开始,关键字不再是闭包types的一部分,因此它们不会(也不能)出现在任何types的预期位置,比如type aliasfunc声明。

请参阅本文中的答案以获取更多信息。

封闭件被devise成多function的。 您没有参数名称,因为您创build的函数可能与其他人的权限大不相同。

请记住,参数名称属于该函数

为了说明,当我创build一个函数时,我会这样做:

 func getUser(for name: String) -> User { // Stuff here... } 

我添加标签让自己和其他人知道如何正确使用该function。

闭包参数不是一个函数,你传入一个函数。 一个人写的function可以创造一个芝士汉堡,而另一个人可以写一个旋转180度的视图,并继续到一个新的视图控制器。

UIView上的Apples文档的一个例子,有一个叫做completion的结束completion 。 正如这个名字所暗示的,这个函数在animation完成时被触发。 现在文档确实解释了Bool值告诉你animation是否完整,从函数本身来看是不明显的。

如果你不确定参数是用于什么(例如上面),看看文档。

希望这回答你的问题。