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 / Xcode 8 beta 6 中未调用 UIApplicationShortcutItem 的 AppDelegate 函数
“无法将类型 'String' 的值分配给类型 'AnyObject?'”,Swift 3,Xcode 8 beta 6
Xcode 8 beta 6 AnyObject Swift 3 变化