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

Posted

技术标签:

【中文标题】Swift 3 / Xcode 8 beta 6 中未调用 UIApplicationShortcutItem 的 AppDelegate 函数【英文标题】:AppDelegate function for UIApplicationShortcutItem not being called in Swift 3 / Xcode 8 beta 6 【发布时间】:2016-08-16 17:31:43 【问题描述】:

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 语法,还是以任何建议的方式修复,使用快捷方式启动应用程序都不会触发它。

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

【问题讨论】:

【参考方案1】:

that method 的签名现在是:

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

请注意,完成处理程序现在是 @escaping,每个 SE-103 (Make non-escaping closures the default)。这个属性改变了闭包参数的类型签名,进而改变了它作为参数的方法的类型签名,所以旧声明的方法不会被调用。

一般来说,编译器警告/修复对于捕获所有类型签名更改并不是那么好,尤其是在 beta 之间。您最好的选择是返回 SDK 标头(或者更确切地说,从它生成的 Swift 接口)或 Apple 网站上的 documentation/Xcode 中定义问题方法的类/协议,这样您就可以看到它的新定义是。

【讨论】:

【参考方案2】:

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

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

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

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

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

【讨论】:

以上是关于Swift 3 / Xcode 8 beta 6 中未调用 UIApplicationShortcutItem 的 AppDelegate 函数的主要内容,如果未能解决你的问题,请参考以下文章

swift 3(xCode8-beta6)上的可达性问题

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

“无法将类型 'String' 的值分配给类型 'AnyObject?'”,Swift 3,Xcode 8 beta 6

Xcode 8 beta 6 AnyObject Swift 3 变化

Xcode6-Beta3 更新后,无法使用 Swift 访问键盘信息

使用 Alamofire Swift 3 和 Xcode 8 beta 解析 JSON 没有数据