Swift 3 / Xcode 8 beta 6中未调用UIApplicationShortcutItem的AppDelegate函数

3
Swift 3 的转换器改变了这个(完美工作的)语句:
func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {

转换为:

func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {

但两者都会产生警告

实例方法'application(:handleActionWithIdentifier:for:completionHandler:)'几乎匹配协议'UIApplicationDelegate'的可选要求'application(:handleActionWithIdentifier:for:completionHandler:)'。

并提供了使函数private或添加@nonobjc的解决方案。

无论是保留该函数的警告,还是将其恢复为Swift 2语法,或按建议的任一方式修复,使用快捷方式启动应用程序都不会触发它。

这在此处未列为已知问题。有人有什么想法吗?

2个回答

5

该方法的签名现在为:

optional func application(_ application: UIApplication, 
          performActionFor shortcutItem: UIApplicationShortcutItem,
                      completionHandler: @escaping (Bool) -> Void)

请注意,完成处理程序现在是逃逸的,根据SE-103 (使非逃逸闭包成为默认)。此属性更改了闭包参数的类型签名,从而更改了它作为参数的方法的类型签名,因此具有旧声明的方法将不会被调用。
通常,编译器警告/修复程序不能很好地捕获所有类型签名更改,特别是在beta之间。您最好返回SDK头文件(或者更确切地说,从中生成的Swift接口)或Apple网站/Xcode上定义问题方法的类/协议的文档,以便查看其新定义。

1

苹果在Swift 3 Beta 6中引入了@escaping标签。 现在所有的闭包默认都是非逃逸的,所以如果你想要一个逃逸的闭包,你需要添加这个标签。由于某些原因,Swift翻译器没有添加这个标签,但根据下面链接中的文档,你需要在闭包之前添加这个标签。

https://developer.apple.com/reference/uikit/uiapplicationdelegate/1622935-application

在我的代码中添加闭包后,警告消失了。
func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler:@escaping (Bool) -> Void)

我没有测试过它,因此它可能只是因为其他原因而删除了警告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接