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
如何使用 URLSession 解析并将它们导入 Swift 的数组中?
使用 URLSession 将数据获取到 PHP 方法 - swift