我已经更新到Xcode8,swift3和Alamofire 4,现在我在'alamofire.request'开头的下面一行中收到错误'额外参数'方法'
var pulseVoteEndpoint: String = "https://example.com/app1/votingapi/set_votes.json"
var pulseNewVote = ["votes":[["value":valueString,"uid":uidString,"entity_id":nidInt,"entity_type":"node","tag":"points","value_type":"points"]]]
Alamofire.request(pulseVoteEndpoint, method: .post, parameters: pulseNewVote, encoding: .json)
.response { request, response, data, error in
debugPrint(response)
print(request)
print (response)
print (error)
}
有什么想法吗?
谢谢
答案 0 :(得分:2)
encoding
的{{1}}参数需要request(...)
属性,而不是static
个案例。我们可以看一下enum
(Alamofire/Source/Alamofire.swift)
request(...)
方法的签名
Alamofire
第一个参数是符合协议public func request(
_ url: URLConvertible,
method: HTTPMethod = .get,
parameters: Parameters? = nil,
encoding: ParameterEncoding = URLEncoding.default,
headers: HTTPHeaders? = nil)
-> DataRequest
{ /* ... */ }
的参数,String
is valid;到目前为止一切都很好。
第二个参数的类型是simply an enum
URLConvertible
是有效的案例,OK。
第三个参数应为.post
类型,即a typealias for [String: Any]
Parameters
您提供的参数/// A dictionary of parameters to apply to a `URLRequest`.
public typealias Parameters = [String: Any]
的类型为pulseNewVote
,但仍应能够被预期的参数类型(Dictionary<String, Array<Dictionary<String, Any>>>
)使用。所以这应该仍然没问题,即使你可能想通过明确地将Dictionary<String, Any>
的类型注释为pulseNewVote
来考虑帮助Swift:
[String: Any]
第四个参数,然而,编码不是var pulseNewVote: [String: Any] = ...
,而是一些enum
类型符合的protocol ParameterEncoding
。这些类型具有静态成员(返回struct
的实例),在显式类型时可能看起来像self
个案例,但必须包含显式类型
enum
因此,您需要将提供给第四个参数public struct JSONEncoding: ParameterEncoding {
// MARK: Properties
/// Returns a `JSONEncoding` instance with default writing options.
public static var `default`: JSONEncoding { return JSONEncoding() }
// ...
}
的值替换为例如.json
。 JSONEncoding.default
。使用此修复程序,您对request
的调用应如下所示:
Alamofire.request(pulseVoteEndpoint, method: .post, parameters: pulseNewVote, encoding: JSONEncoding.default)
您给出的错误(附加参数)来自reponse
调用的完成处理程序。提供给response
的调用的完成处理程序是一个以DefaultDataResponse
为参数的函数(不是你尝试的4个不同的参数)。 DefaultDataResponse
类型的实例包含公开成员request
,response
,data
和error
,您可以通过单个response
参数访问(完成处理程序中的类型DefaultDataResponse
)。在response
调用此事实后调整完成处理程序(使用example from the Alamofire documentation,我们可以构建最终的request
和response
链式调用:
Alamofire.request(pulseVoteEndpoint, method: .post, parameters: pulseNewVote, encoding: JSONEncoding.default)
.response { response in
// note that these are all optionals, so
// you might want to unwrap them first
print(response.request)
print(response.response)
print(response.error)
}
答案 1 :(得分:1)
而不是.json
进行编码,请尝试JSONEncoding.default
。
您的参数应该投放到:[String : Any]?
这是编译器的问题,错误地报告了额外参数的错误。
最后,您的行应如下所示:
Alamofire.request(pulseVoteEndpoint, method: .post, parameters: pulseNewVote as [String : Any]?, encoding: JSONEncoding.default)
.response { request, response, data, error in
// rest of the code
答案 2 :(得分:0)
我有一个Xcode错误,导致此错误发生,因为不需要的时候,部分url字符串被强行打开。
以下是具有错误包装属性的呼叫:
Alamofire.request(baseUrl + "notes/\(note.id!)", method: .get, parameters: nil, encoding: JSONEncoding.default, headers: headers).responseJSON { [weak self] response in
这是消除错误的固定呼叫:
Alamofire.request(baseUrl + "notes/\(note.id)", method: .get, parameters: nil, encoding: JSONEncoding.default, headers: headers).responseJSON { [weak self] response in
答案 3 :(得分:0)
在我的情况下,问题出在headers参数中。它应该是 [String:String]
加上parameters参数应该为[String:Any]
我使用 Alamofire 4.8.2 如下解决了该编译错误:
let parameters = ["key":"value","key2":1] as [String:Any]
let headers = ["header_1":"value"] as [String:String]
let encoding:URLEncoding = URLEncoding.default
Alamofire.request("base_url",
method: .post,
parameters: parameters,
encoding: encoding,
headers: headers)