Swift 3.0 迁移后的 Alamofire 错误:“无法将 '(URL, HTTPURLResponse)-> (URL)' 类型的值转换为预期的参数类型 'Parameters'”?
Posted
技术标签:
【中文标题】Swift 3.0 迁移后的 Alamofire 错误:“无法将 \'(URL, HTTPURLResponse)-> (URL)\' 类型的值转换为预期的参数类型 \'Parameters\'”?【英文标题】:Alamofire error after Swift 3.0 migration: "Cannot convert value of type '(URL, HTTPURLResponse)-> (URL)' to expected argument type 'Parameters'"?Swift 3.0 迁移后的 Alamofire 错误:“无法将 '(URL, HTTPURLResponse)-> (URL)' 类型的值转换为预期的参数类型 'Parameters'”? 【发布时间】:2016-10-05 01:57:48 【问题描述】:我目前正在将我的代码库更新到 Swift 3.0。我正在使用 Alamofire。我不得不将 Alamofire 更新到 4.0 (Alamofire git repo)。我有一种下载媒体(视频)的方法,在迁移之前它工作得很好。使用 Xcode 的迁移工具后,我遇到了这个错误:“无法将类型 '(URL, HTTPURLResponse)-> (URL)' 的值转换为预期的参数类型 'Parameters?',这是一个 [String: Any]。到底是什么是这个Parameters对象吗?为什么它会抛出错误?迁移之前的这段代码和现在的唯一区别是现在NSURL被URL替换了。任何帮助都会很棒,因为我在过去的3个小时里一直坚持这个。
let mediaSourceURI: String = media.sourceURI
var filePath: URL?
let destination: (URL, HTTPURLResponse) -> (URL) =
(temporaryURL, response) in
if let directoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first, let suggestedFilename = response.suggestedFilename
filePath = directoryURL.appendingPathComponent("\(suggestedFilename)")
return filePath!
return temporaryURL
//ERROR BELOW: "destination" is highlighted, and says "Cannot convert value of type '(URL, HTTPURLResponse)-> (URL)' to expected argument type 'Parameters?"
RequestManager.mediaDownloadAlamofireManager.download(mediaSourceURI, method: .get, parameters: destination).response
(request, response, data, error) -> Void in
self.completeOperation()
这是我一直试图用作参考的链接:Alamofire 4.0 Migration Guide,特别是在参数编码协议部分。
以下是 Alamofire 中更新的下载方法的语法:
//mediaDownloadAlamofireManager代码,没有错误:
static let mediaDownloadAlamofireManager: SessionManager =
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
let serverTrustPolicies: [String: ServerTrustPolicy] = [baseURL : .disableEvaluation]
let manager = SessionManager(
configuration: configuration,
serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)
return manager
()
【问题讨论】:
您所指的参数期望类型为[String: Any]
,但您的是(URL, HTTPURLResponse) -> (URL)
。但是,您的 RequestManager 是什么?你定义了吗?
RequestManager 是“mediaDownloadAlamofireManager”,一个SessionManager,在另一个文件中全局定义。是的,我使用的下载方法很可能已经过时了,我已经尝试过你提到的那种方法,但我仍然没有正确创建我的“参数”。我不太确定如何将我的目的地转换为 [String: Any]
也许这有帮助:一个参数的例子是let exampleParameters = ["search": "bob"]
,然后Alamofire中的调用将是:Alamofire.download(mediaSourceURI, method: .get, parameters: exampleParameters)
或在你的情况下RequestManager.mediaDownloadAlamofireManager.download(mediaSourceURI, method: .get, parameters: exampleParameters)
啊,我知道问题所在。只需使用您的初始代码并将.download(mediaSourceURI, method: .get, parameters: destination)
中的单词参数替换为目标,因此它看起来像.download(mediaSourceURI, method: .get, destination: destination)
。一定是错别字
【参考方案1】:
1. 简单的错字
RequestManager.mediaDownloadAlamofireManager.download(mediaSourceURI, 方法:.get,参数:目的地)
与
RequestManager.mediaDownloadAlamofireManager.download(mediaSourceURI, 方法:.get,目的地:目的地)
2。 DownloadFileDestination-Type 的变化
Alamofire 4.0 changed the type of DownloadFileDestination
– 您调用的参数destination。它从:
(URL, HTTPURLResponse) -> (URL)
到
(URL, HTTPURLResponse) -> (URL, DownloadRequest.DownloadOptions)
所以你还需要把你的方法改成这样:
let destination: (URL, HTTPURLResponse) -> (URL, DownloadRequest.DownloadOptions) =
(temporaryURL, response) in
if let directoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first, let suggestedFilename = response.suggestedFilename
filePath = directoryURL.appendingPathComponent("\(suggestedFilename)")
return (filePath!, [.removePreviousFile, .createIntermediateDirectories])
return (temporaryURL, [.removePreviousFile, .createIntermediateDirectories])
请注意,您不再只是返回 url,还有more control over how Alamofire stores files on the file system。只需指定您想要的选项,例如 removePreviousFile 或/和 createIntermediateDirectories。它们现在以 Tuple 的形式返回。
【讨论】:
我刚试过,它仍然产生错误:“调用中的参数标签不正确(有':method:destination:',预期':method:parameters:') . 谢谢你顺便帮我。 方法mediaDownloadAlamofireManager
长什么样子?我假设您将其定义为与 Alamofire 接口?我假设您还需要更新那个。
我用 mediaDownloadAlamofireManager 代码编辑了我的问题
@JoshO'Connor 我注意到他们在 4.0 中更改了 DownloadFileDestination 类型。请查看我的更新答案。以上是关于Swift 3.0 迁移后的 Alamofire 错误:“无法将 '(URL, HTTPURLResponse)-> (URL)' 类型的值转换为预期的参数类型 'Parameters'”?的主要内容,如果未能解决你的问题,请参考以下文章
Alamofire 自定义响应从 Alamofire v1.3 迁移到 3.0(和 Swift 2 语法)
在 Swift 3.0 (Alamofire 4.4.0) 中的一些请求后,Alamofire 停止工作
Swift 3.0 迁移后的 Project-Swift.h 文件编译相同函数数百次,编译耗时 7 分钟