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

AppDelegate function for UIApplicationShortcutItem not being called in Swift 3 / Xcode 8 beta 6

Swift 3 转换器改变了这一行(功能完美):

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

对此:

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

但两者都会产生警告

Instance method 'application(:handleActionWithIdentifier:for:completionHandler:)' nearly matches optional requirement 'application(:handleActionWithIdentifier:for:completionHandler:)' of protocol 'UIApplicationDelegate'

并提供使函数private或添加@nonobjc.

的解决方案

无论函数是否留下警告、恢复为 Swift 2 语法或以任何建议的方式修复,使用快捷方式启动应用程序都不会触发它。

这也未列为已知问题 here。有人有想法吗?

Apple 在 Swift 3 Beta 6 中引入了 @escaping 标签。 现在所有的闭包都默认没有转义,所以如果你想要一个可以转义的闭包,你需要给出那个标签。由于某些原因 swift 翻译者没有添加此标签,但根据下面 link 中的文档,您需要在关闭之前添加此标签。

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

将闭包添加到我的代码中删除了警告:

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

我没有测试它,所以它可能只是出于其他原因删除了警告。

that method 的签名现在是:

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

请注意,根据 SE-103 (Make non-escaping closures the default),完成处理程序现在是 @escaping。此属性更改闭包参数的类型签名,进而更改作为参数的方法的类型签名,因此不会调用具有旧声明的方法。

一般来说,编译器 warnings/fixits 不能很好地捕获所有类型签名更改,尤其是在 beta 之间。你最好的选择是 return 到 SDK header(或者更确切地说,从它生成的 Swift 界面)或苹果网站上的 documentation / Xcode对于定义问题方法的 class/protocol,这样您就可以看到它的新定义是什么。