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 语法)

Alamofire Swift 3.0 调用中的额外参数

在 Swift 3.0 (Alamofire 4.4.0) 中的一些请求后,Alamofire 停止工作

Swift 3.0 迁移后的 Project-Swift.h 文件编译相同函数数百次,编译耗时 7 分钟

Alamofire 的 Swift 扩展方法返回 SwiftyJSON 结果

POST 请求 Swift 3.0 Alamofire