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方法,如applicationDidFinishLaunching和applicationDidBecomeActive:
但也适用于tableViewSelectionDidChange:

我使用代码完成来插入方法签名,并尝试从SDK标头中复制它们以排除拼写错误.警告不会消失,并且永远不会调用这些方法.
我在这里错过了什么?
小智 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)
(即将方法公开)摆脱警告,并按预期方式调用该方法。请注意,自动完成功能不会将公共访问修饰符放在方法上。
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)
对我来说,问题是自定义Error类
基本上我有自己的类,名称Error和编译器正在考虑delegate method作为本地方法
我只是更改了我自己的班级名称并且它起作用了。因此,只需确认您在函数中没有任何相同的类名
| 归档时间: |
|
| 查看次数: |
15275 次 |
| 最近记录: |