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

时间:2016-09-14 16:47:39

标签: xcode macos swift3 xcode8

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

Instance method 'someMethod' nearly matches optional requirement of protocol 'protocolName'

我得到了几个NSApplicationDelegate方法,例如applicationDidFinishLaunchingapplicationDidBecomeActive

enter image description here

但也适用于tableViewSelectionDidChange的实现: enter image description here

enter image description here

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

我在这里缺少什么?

10 个答案:

答案 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以使此警告静音。