嵌套结构体调用报错:Argument passed to call that takes no arguments
问题排查与解决
一、结构体初始化错误
你的Parameters2结构体定义时直接给inputparameters赋值了默认的inputParameters实例,且未定义接收参数的初始化器。Swift结构体默认生成无参的成员初始化器,因此传入inputParameters实例时会触发“Argument passed to call that takes no arguments”错误。
修正方案:
调整Parameters2结构体,使其接收inputParameters实例作为初始化参数,同时保证属性名与目标参数的"inputParameters"键名一致(注意大小写):
struct Parameters2: Encodable { let inputParameters: inputParameters init(inputParameters: inputParameters) { self.inputParameters = inputParameters } } struct inputParameters: Encodable { let A1: String let B1: String let C1: String let D1: String }
正确创建实例:
let inputParams = inputParameters(A1:"something", B1:"something", C1:"something", D1:"something") let params = Parameters2(inputParameters: inputParams) // 结构体初始化不会返回nil,无需guard let判断
二、AFNetworking请求调用类型不匹配
executePost方法参数为Parameters2类型,但调用时传入了JSONEncoder().encode(params)返回的Data类型,导致类型不匹配错误。
修正方案:
AFNetworking的JSONParameterEncoder支持直接处理Encodable类型参数,无需手动编码,直接传入Parameters2实例即可:
// 先创建正确的参数实例 let inputParams = inputParameters(A1:"something", B1:"something", C1:"something", D1:"something") let params = Parameters2(inputParameters: inputParams) // 调用executePost executePost(parameters: params) { json, error in if let error = error { print(error.localizedDescription) } else if let json = json { print(json) } }
优化请求方法的响应处理:
原方法中response.value是Data?类型,直接转Any不规范,建议改用responseJSON自动解析JSON:
func executePost(parameters: Parameters2, completion: @escaping (Any?, Error?) -> Void) { AF.request("myURL", method: .post, parameters: parameters, encoder: JSONParameterEncoder.default, headers: headers) .responseJSON { response in debugPrint(response) switch response.result { case .success(let json): completion(json, nil) case .failure(let error): completion(nil, error) } } }
内容的提问来源于stack exchange,提问作者Mansidak
相关产品推荐
相关产品推荐

