Xcode 8中的警告:实例方法几乎与可选要求相匹配

时间:2016-09-07 11:57:57

标签: xcode notifications ios10

我正在尝试在iOS10中实现本地通知,到目前为止it is not working

我在委托方法中得到了这个警告:

Instance method 'userNotificationCenter(_:didReceive:withCompletionHandler:)'     
nearly matches optional requirement 'userNotificationCenter(_:didReceive:withCompletionHandler:)'
of protocol 'UNUserNotificationCenterDelegate'

作为解决方案xcode建议两个选项: 把它变成私人的 2.制作它@nonobjc

为什么?我为什么需要这样做?最重要的是,如何使这些方法有效?

enter image description here

2 个答案:

答案 0 :(得分:3)

Xcode 8 beta 6引入了许多Swift 3更改,其中一个是@escaping关键字,用于标记在方法返回后可能使用的闭包。完成处理程序通常是转义闭包,因为你可能向用户显示一些信息,等待反馈,然后然后调用完成处理程序 - 该方法将返回并保持对闭包的引用,而不是阻塞

我预计在接下来的几个小时内会发布一个Xcode 8 GM,但是现在Xcode 没有在需要的地方插入@escaping属性,这可能是导致你的错误的原因。两个修复 - 它提供的是红色鲱鱼,我很害怕。

尝试编写这样的方法:

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

编辑:Xcode 8 GM现已推出,并在需要时正确插入@escaping

答案 1 :(得分:0)

我有这样一句话:

func textFieldShouldReturn(textField: UITextField) -> Bool {...} 

Xcode给了我相同的“几乎匹配可选要求”警告。 Xcode 8.0 GM fixit让我有两种选择来消除警告。添加私人关键字:

 private func textFieldShouldReturn(textField: UITextField) -> Bool {...} 

或添加@nonobjc子句:

@nonobjc func textFieldDidEndEditing(textField: UITextField) {...} 

要么关闭它,但我不确定哪一个更可取。当我尝试@escaping时,我收到一个错误“@escaping可能只用于'参数'声明'。