request(...) 的 encoding 参数需要 static 属性,而不是 enum 情况。
我们可以看看Alamofire(Alamofire/Source/Alamofire.swift)的静态request(...)方法的签名
public func request(
_ url: URLConvertible,
method: HTTPMethod = .get,
parameters: Parameters? = nil,
encoding: ParameterEncoding = URLEncoding.default,
headers: HTTPHeaders? = nil)
-> DataRequest
{ /* ... */ }
第一个参数是符合URLConvertible协议的参数,String is valid;到目前为止一切顺利。
第二个参数的类型是simply an enum,.post 是一个有效的情况,OK。
第三个参数的类型应该是Parameters,即a typealias for [String: Any]
/// 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 到 [String: Any] 的类型来帮助 Swift:
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)
}