无法将类型“[String : String]”的值转换为预期的参数类型“HTTPHeaders?”

Posted

技术标签:

【中文标题】无法将类型“[String : String]”的值转换为预期的参数类型“HTTPHeaders?”【英文标题】:Cannot convert value of type '[String : String]' to expected argument type 'HTTPHeaders?' 【发布时间】:2020-01-03 14:45:32 【问题描述】:

我正在尝试使用 MailgunAlarmofire 从我的 ios 应用程序发送邮件我发现 this piece of code 但 Xcode 生成错误:

无法将“[String : String]”类型的值转换为预期参数 输入“HTTPHeaders?”

代码:

let parameters = [
                   "from": "sender@whatyouwant.com",
                     "to": "anyRecipient@example.com",
                "subject": "Subject of the email",
                   "text": "This is the body of the email."]
    let header = [
            "Authorization": "Basic MY-API-KEY",
            "Content-Type" : "application/x-www-form-urlencoded"]

    let url = "https://api.mailgun.net/v3/MY-DOMAIN/messages"
    Alamofire.request(url,
                   method: .post,
               parameters: parameters,
                 encoding: URLEncoding.default,
                  headers: header)
            .responseJSON  response in
                print("Response: \(response)")
                

有什么建议吗?

【问题讨论】:

【参考方案1】:

您需要明确设置类型。

let headers : HTTPHeaders = [
    "Authorization": "Basic MY-API-KEY",
    "Content-Type" : "application/x-www-form-urlencoded"
]

【讨论】:

更好的是,使用这些标头的强类型版本:.authorization("Basic MY-API-KY).contentType("application/x-www-form-urlencoded")。而且你不需要设置内容类型,参数 encoding/encoder 会帮你搞定的。 是的,这发生在使用 [String: String] 的旧定义的解决方案中。相同但类型应该是 HTTP 标头【参考方案2】:

要修改现有代码,请创建字典扩展以从 [String: String] 转换为 HTTPHeaders。

extension Dictionary where Key == String, Value == String 
    func toHeader() -> HTTPHeaders 
        var headers: HTTPHeaders = [:]
        for (key, value) in self  
            headers.add(name: key, value: value)
        
        return headers
    

并使用这个扩展来投射它。

AF.request(url, method: requestMethod, parameters: nil, encoding: URLEncoding.default ,headers: header?.toHeader())

【讨论】:

以上是关于无法将类型“[String : String]”的值转换为预期的参数类型“HTTPHeaders?”的主要内容,如果未能解决你的问题,请参考以下文章

无法将类型 ('string', 'string') 隐式转换为 System.Net.ICredentialsByHost

无法使用“Int”类型的索引为“[String : String]”类型的值下标

Swift3:如何将一个String类型值添加到已经粘贴了计算值的UI Label中?

PromiseKit 6:无法使用类型为“((String,String)-> Promise<Data>)”的参数列表调用“then”

无法将类型的值转换为UINavigationController swift3

swift 3完成处理程序返回字符串