Swift:使用 URLSession 的“表达式类型不明确,没有更多上下文”

Posted

技术标签:

【中文标题】Swift:使用 URLSession 的“表达式类型不明确,没有更多上下文”【英文标题】:Swift: "Type of expression is ambiguous without more context" with URLSession 【发布时间】:2021-06-14 16:12:02 【问题描述】:

我正在尝试在下面实现此代码以在 WKWebView 中捕获 PDF 下载:

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) 
    if let url = navigationAction.request.url 

        print("fileDownload: check ::  \(url)")

        let extention = "\(url)".suffix(4)

        if extention == ".pdf" 
            print("fileDownload: redirect to download events. \(extention)")
            DispatchQueue.main.async 
                self.downloadPDF(tempUrl: "\(url)")
            
            decisionHandler(.cancel)
            return
        

    

    decisionHandler(.allow)


func downloadPDF(tempUrl:String)
    print("fileDownload: downloadPDF")
    guard let url = URL(string: tempUrl) else  return 
    let urlSession = URLSession(configuration: .default, delegate: self, delegateQueue: OperationQueue())
    let downloadTask = urlSession.downloadTask(with: url)
    downloadTask.resume()
    //showHUD(isShowBackground: true); //show progress if you need

func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController 
    print("fileDownload: documentInteractionControllerViewControllerForPreview")
    return self

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) 
    // create destination URL with the original pdf name
    print("fileDownload: urlSession")
    guard let url = downloadTask.originalRequest?.url else  return 
    print("fileDownload: urlSession \(url)")
    let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let destinationURL = documentsPath.appendingPathComponent(url.lastPathComponent)
    // delete original copy
    try? FileManager.default.removeItem(at: destinationURL)
    // copy from temp to Document
    do 
        try FileManager.default.copyItem(at: location, to: destinationURL)
        myViewDocumentsmethod(PdfUrl:destinationURL)
        print("fileDownload: downloadLocation", destinationURL)
        DispatchQueue.main.async 
            NBMaterialToast.showWithText(self.view, text: "Download Completed", duration: NBLunchDuration.long)
        
     catch let error 
        print("fileDownload: error \(error.localizedDescription)")
    
   // dismissHUD(isAnimated: false); //dismiss progress

func myViewDocumentsmethod(PdfUrl:URL)
    print("fileDownload: myViewDocumentsmethod \(PdfUrl)")
    DispatchQueue.main.async 
        let controladorDoc = UIDocumentInteractionController(url: PdfUrl)
        controladorDoc.delegate = self
        controladorDoc.presentPreview(animated: true)
    

正如这个帖子所建议的那样:

Download embedded PDF loaded in WKWebView

但是 Xcode 给了我以下错误:

“没有更多上下文,表达式的类型是模棱两可的”

对于 downloadPDF 函数中的以下行:

let urlSession = URLSession(configuration: .default, delegate: self, delegateQueue: OperationQueue())

如您在随附的屏幕截图中所见。

关于如何解决这个问题的任何想法?

【问题讨论】:

也许从缩小问题的原因开始。如果将 delegate 和/或 delegateQueue 参数更改为 nil,会发生什么?如果您明确配置参数,即URLSessionConfiguration.default,会发生什么?另外,self 的类型是什么,它是如何声明符合URLSessionDelegate 的? 试过了,但问题仍然存在...... 【参考方案1】:

继承URLSessionDelegate 协议给你的类。

【讨论】:

是的!就是这样!太愚蠢了,我没想到……非常感谢!

以上是关于Swift:使用 URLSession 的“表达式类型不明确,没有更多上下文”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 3 中使用带有代理的 URLSession

swift--使用URLSession异步加载图片

如何使用 URLSession 解析并将它们导入 Swift 的数组中?

使用 URLSession 将数据获取到 PHP 方法 - swift

通过证书进行客户端身份验证的 Swift 3 UrlSession

将 URLSession 更新为 swift 3 抛出错误