Xcode 8警告"实例方法几乎匹配可选要求"

cod*_*nd1 27 macos xcode swift3 xcode8

我在Xcode 8中将我的(macOS)项目转换为Swift 3,并且我使用swift类中实现的几个委托方法得到以下警告:

Instance method 'someMethod' nearly matches optional requirement of protocol 'protocolName'
Run Code Online (Sandbox Code Playgroud)

我得到这个好NSApplicationDelegate方法,如applicationDidFinishLaunchingapplicationDidBecomeActive:

在此输入图像描述

但也适用于tableViewSelectionDidChange: 在此输入图像描述

在此输入图像描述

我使用代码完成来插入方法签名,并尝试从SDK标头中复制它们以排除拼写错误.警告不会消失,并且永远不会调用这些方法.

我在这里错过了什么?

cod*_*nd1 26

我们与此问题联系了Apple Developer Technical Support(DTS).他们回答说这是XCode 8中的一个错误.

我们提交了一份错误报告,希望能够快速更新.(Apple Bug报告编号:28315920).

如果您遇到类似问题,请同时提交错误报告(指我们的),以便Apple工程师看到它不是一个案例.


XCode更新≥8.1

现在问题似乎已解决,至少对于我们在项目中使用的委托方法.

  • 我已更新到xCode 8.2,我仍有问题:( (14认同)

小智 18

经过几个小时的搜索,我发现了这个 - 在子类中没有调用的Swift 3 ObjC可选协议方法

您可以通过在函数前面加上objective-c声明来解决该错误

@objc(tableViewSettingsDidChange:notification:)
func tableViewSettingsDidChange(_ notification:Notification)
Run Code Online (Sandbox Code Playgroud)


DCD*_*CDC 12

您可能会收到此错误的原因之一与方法访问修饰符有关。例如,如果您未将函数定义为public。因此,对于CLLocationManagerDelegate情况下的方法,请更改:

func locationManager(_ manager: CLLocationManager,
                     didChangeAuthorization status: CLAuthorizationStatus)
Run Code Online (Sandbox Code Playgroud)

至:

public func locationManager(_ manager: CLLocationManager,
                            didChangeAuthorization status: CLAuthorizationStatus)
Run Code Online (Sandbox Code Playgroud)

(即将方法公开)摆脱警告,并按预期方式调用该方法。请注意,自动完成功能不会将公共访问修饰符放在方法上。


Ror*_*yan 5

NSError桥接到Swift 时,此警告的另一个原因:

鉴于此Objective-C委托方法:

- (void)myService:(id<MYService>)myService didFailForSomeReason:(NSError *)error;
Run Code Online (Sandbox Code Playgroud)

这将自动生成以下Swift方法:

public func myService(_ myService: MYService!, didFailForSomeReason error: Error!)
Run Code Online (Sandbox Code Playgroud)

显示警告。

在我的情况下,原因是我的班级有它自己的Error类型,因此签名解析为MyClass.Error而不是Swift.Error。解决方案是通过将Error参数更改为来完全键入Error参数Swift.Error

public func myService(_ myService: MYService!, didFailForSomeReason error: Swift.Error!)
Run Code Online (Sandbox Code Playgroud)


Sul*_*Ali 5

对我来说,问题是自定义Error
基本上我有自己的类,名称Error和编译器正在考虑delegate method作为本地方法

我只是更改了我自己的班级名称并且它起作用了。因此,只需确认您在函数中没有任何相同的类名