注意:我已经弄清楚了大部分内容 - 请参阅最后的更新。还是有些迷茫。
我正在尝试在 Swift 3 下的 Xc8b6 中实现 NSUserActivity 处理,但处理程序协议方法的方法签名遇到问题。
在当前的文档中,该方法据说是:
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([Any]?) -> Void) -> Bool
这与我在 swift header 界面中看到的略有不同。其中,restorationHandler 中的返回类型是 Swift.Void。
当我尝试这个时,我得到的错误是:
提供 Objective-C 方法“application:continue:restorationHandler:”
通过方法 'application(_:continue:restorationHandler:)' 不匹配
需求的选择器
('应用程序:继续用户活动:恢复处理程序:')
我意识到编译器警告现在不太好,但我认为这意味着它找到了 Obj-C 方法签名,但不知何故我的参数不太匹配。
我不知道还能去哪里。它与那里的东西相匹配 - 但是某物是错的。随机猜测和检查还没有帮助我。
有趣的是,自动完成给了我一个不同的方法签名:
public func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: ([Any]?) -> Void) -> Bool
这个的好处是它可以编译。不太好的事情是,当我从 Spotlight 中选择索引项目并点击它来启动应用程序时,它不会被触发。
显然我的 NSUserAction 正确识别了该应用程序并启动了它。有没有什么我可能会错过的地方,它不会触发restoreHandler?请注意,这是从在 iOS 9 下运行良好的项目转换而来的。
我还在 WWDC 视频中的 What's New With Search 中看到了协议方法签名的另一个版本。我尝试了一下,它编译了,但也没有触发。
更进一步来说,这是我在 Swift 3 转换工具完成后得到的签名。它编译了,但从聚光灯下启动时没有被触发:
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]) -> Void) -> Bool
- - 更新 - - -
好的。所以上面提到的第一个方法签名是正确的。问题是我在 AppDelegate 的扩展中定义它。这在 Swift 2.x 中运行良好。
我已经把它移上去,一切都很好。但我想更好地理解为什么在从扩展实现协议方法时会出现这些编译错误。它不再符合协议一致性吗?如果我尝试将其添加到扩展中,我会收到一条错误,表明它是重复的,所以我认为这并不完全是这样。