在阅读时UIKit
,大多数时候,我会看到闭包(作为函数参数)缺少像这样的参数标签:func fooClosure(fooClosure: (Bool) -> Swift.Void)
在某些情况下,我可以猜测它代表什么,而在另一些情况下,我则无法。
看一下UIActivityViewController
的闭包之一(作为类型别名):
public typealias UIActivityViewControllerCompletionWithItemsHandler = (UIActivityType?, Bool, [Any]?, Error?) -> Swift.Void
什么是第三类型代表什么?我必须查看代码的Objective-C版本才能知道它们是returnedItems
。
为什么未采用这种方式实施:(请注意activityItems
标签)
public typealias UIActivityViewControllerCompletionWithItemsHandler = (UIActivityType?, Bool, _ activityItems: [Any]?, Error?) -> Swift.Void
编辑: -这仅仅是一个临时状态(因为Swift尚未完全集成在这些框架中)?没有参数标签,代码的可读性较差。
问题在于这是机器生成的函数签名类型别名,并且机器没有按照您的意愿进行操作。考虑以下Objective-C声明:
typedef void (^MyCoolType)(NSString* __nullable name);
Swift生成的接口是:
public typealias MyCoolType = (String?) -> Swift.Void
如您所见,name
被剥夺了;这无处可寻。
在Swift中,没有什么可以阻止您使用内部标签定义函数签名类型别名。这是合法的:
public typealias MyCoolType = (_ name:String?) -> Void
但这并不是从Objective-C生成生成的接口的方式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句