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,这样您就可以看到它的新定义是什么。
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,这样您就可以看到它的新定义是什么。