Swift中实例方法调用时无精确匹配。

31

我以前从未遇到过这种情况,Swift 中这个错误信息的含义是什么:

调用实例方法 'dataTask(with:completionHandler:)' 时没有精确匹配

以下是我的代码块:

var request: NSMutableURLRequest? = nil
let task = URLSession.shared.dataTask(
            with: request,
            completionHandler: { data, response, error in
                DispatchQueue.main.async(execute: {
                  /// ...
                })
            })
task.resume()

错误报告

通过feedbackassistant.apple.com报告:FB7717686

注意:该错误在2023年5月1日的Xcode版本14.3中仍然存在。


1
错误信息可能会误导!对我来说,当我将两个可选项作为函数参数传递时 - 两者都需要是非可选的。如果我正确地更正了其中一个输入,则错误将变成有意义的内容:“必须将可选类型“String?”的值解包为类型“String”的值”。当单个参数传递不正确时,编译器能够显示正确的错误消息。然而,当有两个参数时,编译器会给出一个误导性/难以解释的消息。其中一些答案指向了其他误导性的错误。因此,你的情况可能不同。 - mfaani
5个回答

34

为什么 Xcode 喊叫?

也许消息文本看起来有点 不言自明 ,但是因为 Xcode 没有精确指向参数本身,第一次可能有点难以理解。

Xcode之所以喊叫,是因为该方法要求在方法调用中使用精确的参数类型,这很简单。

问题的解决方案:

var request: URLRequest? = nil

let task = URLSession.shared.dataTask(
            with: request!,
            completionHandler: { data, response, error in
                DispatchQueue.main.async(execute: {

                })
            })
task.resume()

只需使用URLRequest而不是NSMutableURLRequest

一个SwiftUI案例

假设这是你的用户界面:

        ZStack() {
            Image(systemName: "photo")
                .resizable()
                .aspectRatio(contentMode: .fit)
                .background(Color.green)
                .foregroundColor(Color.white)
                .cornerRadius(12)
            Text(getToday())
                .font(.headline)
            }
        }

这是你在 Text(...) 中调用的方法。
    func getToday() -> Any?
    {
        let now = Date()
        let calendar = Calendar.current
        let components = calendar.dateComponents([.day], from: now)
        return components.day

    }

解决方案

在上面的例子中,解决方案是将Any?更改为String类型。

一个NSURL案例

if let url = NSURL(String: "http://example-url.com/picture.png") {
  // ...
}

解决方案
if let url = URL(String: "http://example-url.com/picture.png") {
  // ...
}

ℹ️ 在调用中没有找到完全匹配
实例方法 '* * *'
这是一个关于在方法调用中使用错误类型的通用错误消息。这就是为什么我在这里添加了它,以帮助其他人。
希望这个答案能对你们一些人有所帮助。
最好的祝福。

6
你可能希望向苹果提交一个错误报告。毕竟诊断应该比这更好。 - matt
1
谢谢@matt,我已经通过https://feedbackassistant.apple.com进行了报告。 - mgyky
2
错误仍然在Xcode 12.4中以几乎相同的混乱方式出现,而且已经有将近两年了:我正在使用“session.dataTask(with: url)”但是还没有更改周围的函数以传递URL("url"未声明),这就是我得到的错误,即使“dataTask(with :)”存在。 - Neph

9

我使用了带有URL的dataTask,但是我将URL作为NSURL解包,这就是为什么它会报错的原因。

我的操作如下:

if let url = NSURL(String: "http://myyrl.com/filename.jpg") {
      //my code
}

更正错误的方法是将NSURL替换为URL:
if let url = URL(String: "http://myyrl.com/filename.jpg") {
      //my code 
}

谢谢您的回答。这是关于Xcode的一般性错误信息。它可能会在很多情况下出现。祝好。 - mgyky

5

如果你在 Text 元素中遇到此错误,请尝试用 String(describing: value) 对你的值进行包装。这解决了我的问题。

Text("Leading text \(String(describing: value))")

Source


1
可能不是问题的确切答案,但通常有一种解决方法。通常只是一个未包装的可选项,这样你就会发现。 - brainray

3
当您在将当前类符合 SKPaymentTransactionObserver 协议之前,向代码中添加 SKPaymentQueue 方法(例如 SKPaymentQueue.default().add())时,Xcode 会给出此错误。
如果是这种情况,请使您的类符合 SKPaymentTransactionObserver 协议以解决此错误。

我的类缺少 SKPaymentTransactionObserver,这是唯一有用的评论,谢谢! - Justin Hammond

1

还要检查url是否为实际url而不是字符串

URLSession.shared.dataTask(with: url) { data, response, error

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接