我在Xcode 8中将我的(macOS)项目转换为Swift 3,并且我使用swift类中实现的几个委托方法得到以下警告:
Instance method 'someMethod' nearly matches optional requirement of protocol 'protocolName'
我得到了几个NSApplicationDelegate方法,例如applicationDidFinishLaunching
和applicationDidBecomeActive
:
但也适用于tableViewSelectionDidChange
的实现:
我使用代码完成来插入方法签名,并尝试从SDK标头中复制它们以排除拼写错误。警告不会消失,方法永远不会被调用。
我在这里缺少什么?
答案 0 :(得分:26)
我们已就此问题与Apple开发者技术支持(DTS)联系。 他们回答说这是Xcode 8中的错误。
我们提交了一份错误报告,希望能够快速更新。 (Apple Bug报告编号:28315920)。
如果您遇到类似问题,请同时 file a bug report (指我们的),以便Apple工程师看到它不是一个案例。
Xcode的更新≥8.1
现在问题似乎已解决,至少对于我们在项目中使用的委托方法而言。
答案 1 :(得分:18)
经过数小时的搜索,我发现了这一点 - Swift 3 ObjC Optional Protocol Method Not Called in Subclass
您可以通过在函数
上添加objective-c声明来解决该错误iText
答案 2 :(得分:6)
您可能会收到此错误的原因与方法访问修饰符有关。例如,如果您未将函数定义为public。因此,对于CLLocationManagerDelegate情况下的方法,请更改:
func locationManager(_ manager: CLLocationManager,
didChangeAuthorization status: CLAuthorizationStatus)
收件人:
public func locationManager(_ manager: CLLocationManager,
didChangeAuthorization status: CLAuthorizationStatus)
(即将方法公开)摆脱了警告,并按预期方式调用了该方法。请注意,自动完成功能不会将公共访问修饰符放在方法上。
答案 3 :(得分:4)
当NSError
被桥接到Swift时出现此警告的另一个原因:
鉴于此Objective-C委托方法:
- (void)myService:(id<MYService>)myService didFailForSomeReason:(NSError *)error;
自动生成此Swift方法:
public func myService(_ myService: MYService!, didFailForSomeReason error: Error!)
显示警告。
就我而言,原因是我的班级拥有自己的Error
类型,因此签名正在解析为MyClass.Error
而不是Swift.Error
。解决方案是通过将Error参数更改为Swift.Error
来完全键入Error参数:
public func myService(_ myService: MYService!, didFailForSomeReason error: Swift.Error!)
答案 4 :(得分:4)
对我来说,问题是自定义Error
类
基本上,我有一个名为Error
的类,编译器正在考虑将delegate method
作为本地方法
我刚刚更改了自己的班级名称,它起作用了。因此,只需确认您在函数中没有相同的类名
答案 5 :(得分:1)
为了记录,我在实现WKWebView的didFailProvisionalNavigation委托方法时遇到了同样的问题。解决方案是添加@objc声明和将最后一个参数的类型从Error更改为NSError:
@objc(webView:didFailProvisionalNavigation:withError:)
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: NSError) {
// handle error
}
答案 6 :(得分:1)
这是为我解决的问题。
我在某些代码中收到相同的警告,我确信我最初输入编辑器并允许它自动完成。我随后回去并重新查看了警告,并试图在我现有的功能之后再次输入相同的功能。当我再次输入函数名称时,我的函数签名发生了变化,并且parms与Xcode预期完全匹配并且警告被抑制。
因此,如果您想快速进行健全性检查,请自己帮个忙,再尝试输入该功能,看看parm类型是否有所改变。这可能就是你所需要的。
答案 7 :(得分:0)
只是为此添加澄清而不是复杂的解决方法:任何人都可以看到为什么在采取行动时下面没有解雇/工作?
extension AppDelegate: UNUserNotificationCenterDelegate {
@objc(userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
print("RESPONSE FROM NOTIFICATION!")
switch response.actionIdentifier {
case "reply":
print("Reply action received!")
case "ignore":
print("Ignore action received!")
default: print("Error - Unknown action received!")
break
}
}
}
答案 8 :(得分:0)
这让我转了一圈。这是因为我创建了自己的Notification类。更改此类名称后(不要进行重构,因为它将更改objc Notification参数),所有错误都会消失
答案 9 :(得分:-1)
对于xcode 8.1&gt; =和swift 3,
在方法开头添加@nonobjc以使此警告静音。