注意:我想出了大部分内容 - 请参阅最后的更新。还是有些混乱。
我试图在Swift 3下的Xc8b6中实现NSUserActivity处理,并且处理程序协议方法的方法签名有问题。
在当前的doc中,该方法被称为:
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([Any]?) -> Void) -> Bool
这与我在swift header界面中看到的略有不同。在那里,restorationHandler中的返回类型是Swift.Void。
当我尝试这个时,我得到的错误是:
Objective-C方法'应用程序:continue:restorationHandler:'提供 通过方法'应用程序(_:continue:restorationHandler:)'不匹配 要求的选择器 ('应用:continueUserActivity:restorationHandler:&#39)
我意识到编译器警告现在并不好,但是我认为这意味着它找到了Obj-C方法签名,但是我的论点不太匹配
我不知道还有什么可以用的。它匹配那里的东西 - 但是某些东西是错误的。随机猜测和检查对我没有帮助。
有趣的是,自动完成功能为我提供了不同的方法签名:
public func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: ([Any]?) -> Void) -> Bool
关于这一个的好处是它编译。不太好的是,当我从Spotlight中选择一个索引项并点击它以启动应用程序时,它不会被触发。
显然,我的NSUserAction正确识别了应用并启动了它。有没有什么我可以在这里失踪的地方,它不会发生恢复钓鱼者?请注意,这是从iOS 9下运行正常的项目转换而来。
我还在WWDC视频中看到了另一个版本的协议方法签名,其中包括“新搜索内容”。我试过了,它编译但是没有触发。
只是为了解决问题,这是Swift 3转换工具完成后的签名。它已编译,但在从聚光灯下启动时没有被触发:
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]) -> Void) -> Bool
---- -----更新
确定。所以上面提到的第一个方法签名是正确的。问题是我在AppDelegate的扩展中定义它。这在Swift 2.x中运行良好。
我把它搬了起来,一切都很好。但是我希望更好地理解为什么在从扩展实现协议方法时出现这些编译错误。它是否不再通过协议一致性?如果我尝试将其添加到扩展程序中,我会收到一条错误消息,表明它是重复的,所以我不认为它非常重要。
答案 0 :(得分:2)
最初的问题是关于为什么没有调用continueUserActivity(以及正确的签名是什么)所以我会在这里回答这里添加了一些关于出错的清晰度。
正确的签名就是我在帖子顶部写的:
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([Any]?) -> Void) -> Bool
请记住,此签名与Xc8b6中的自动完成功能不同,因此我怀疑其他人可能会遇到此问题并从此响应中受益。
我最初的问题是它没有编译,因为我是在扩展程序中进行编译的。为清楚起见:
extension AppDelegate {
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
return true
}
}
这适用于任何较旧的iOS 9 / Swift 2.x项目(使用较旧的continueUserActivity签名)。我仍然不肯为什么,但它不会在Xc8 / Swift 3的扩展中编译。
我把它移到了班级范围,现在工作正常。
答案 1 :(得分:0)
因此,看起来从Swift 3开始,协议方法只能在协议附加到类的范围内访问。
这意味着协议 UIApplicationDelegate 内的所有AppDelegate方法只能在AppDelegate类或符合 UIApplicationDelegate 的AppDelegate扩展中访问
如果您尝试在符合UIApplicationDelegate的类/扩展名之外访问UIApplicationDelegate的方法,则无法编译。