无法将类型“[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 【问题描述】:我正在尝试使用 Mailgun
和 Alarmofire
从我的 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”