Swift中如何将数组作为Alamofire请求参数(附类型报错解决)
报错原因
核心问题有两个:
- 类型不匹配:你定义的
addAttendeeService入参类型是[String: Any](对应JSON对象结构),实际传入的attendeeData是[[String: Any]](对应JSON对象数组结构),类型不一致直接触发编译错误。 - 语法错误:你尝试直接构造多对象参数时,存在两个语法问题:一是把数组值赋值给了
[String: Any]类型的常量,类型本身不匹配;二是混用了JavaScript的对象字面量写法,在Swift数组里用{}包裹字典,Swift无法识别这种语法。
另外你贴的代码里还存在重复声明同名parameters常量的问题,同作用域下同名变量/常量不允许重复定义,本身也会触发编译报错。
修复方案
根据接口实际要求的参数格式二选一即可:
场景1:接口要求根节点为单个参会人JSON对象
这种场景不需要把参数包装成数组,直接传入单个字典即可,修复后代码:
// 注意不要重复声明同名parameters,同作用域下变量/常量名不能重复 let parameters: [String: Any] = [ "firstName": atd1FirstName, "lastName": atd1LastName, "email": atd1Email, "telNo": atd1Phone, "nationality": atd1Nationatility, "licenseNumber": atd1LicenseNumber, "companyName": atd1CompanyName, "sessionID": 0, "sessionDetailID": 0, "url": "" ] // 直接传入单个字典,不要包装为数组 addAttendeeService(parameter: parameters) // 方法参数类型保持[String: Any]即可 private func addAttendeeService(parameter: [String: Any]){ DispatchQueue.global().async { AF.request("http://178.18.200.116:96/api/SessionPerson/Add", method: .post, parameters: parameter, encoding: JSONEncoding.default) .response { response in debugPrint(response) } } }
场景2:接口要求根节点为多个参会人组成的JSON数组
这种场景需要修改方法的参数类型,同时用正确的Swift语法构造数组,修复后代码:
@State var attendeeData = [[String: Any]]() let parameters1: [String: Any] = [ "firstName": atd1FirstName, "lastName": atd1LastName, "email": atd1Email, "telNo": atd1Phone, "nationality": atd1Nationatility, "licenseNumber": atd1LicenseNumber, "companyName": atd1CompanyName, "sessionID": 0, "sessionDetailID": 0, "url": "" ] let parameters2: [String: Any] = [ "firstName": atd2FirstName, "lastName": atd2LastName, "email": atd2Email, "telNo": atd2Phone, "nationality": atd2Nationatility, "licenseNumber": atd2LicenseNumber, "companyName": atd2CompanyName, "sessionID": 0, "sessionDetailID": 0, "url": "" ] attendeeData.append(parameters1) attendeeData.append(parameters2) // 传入构造好的数组 addAttendeeService(parameter: attendeeData) // 👇 核心修改:把参数类型从[String: Any]改为[[String: Any]],匹配数组类型 private func addAttendeeService(parameter: [[String: Any]]){ DispatchQueue.global().async { AF.request("http://178.18.200.116:96/api/SessionPerson/Add", method: .post, parameters: parameter, encoding: JSONEncoding.default) .response { response in debugPrint(response) } } }
如果需要直接构造数组参数,不要使用{}包裹字典,正确写法如下:
// 注意类型标注为[[String: Any]],不是[String: Any] let parameters: [[String: Any]] = [ [ "firstName": atd1FirstName, "lastName": atd1LastName, "email": atd1Email, "telNo": atd1Phone, "nationality": atd1Nationatility, "licenseNumber": atd1LicenseNumber, "companyName": atd1CompanyName, "sessionID": 0, "sessionDetailID": 0, "url": "" ], [ "firstName": atd2FirstName, "lastName": atd2LastName, "email": atd2Email, "telNo": atd2Phone, "nationality": atd2Nationatility, "licenseNumber": atd2LicenseNumber, "companyName": atd2CompanyName, "sessionID": 0, "sessionDetailID": 0, "url": "" ] ]
额外提醒
- Swift语法不要和JavaScript混淆:数组用
[]包裹元素,字典也写在[]内,用键值对格式,不需要额外加{}包裹字面量 - Alamofire的
JSONEncoding原生支持根节点为数组的JSON参数序列化,只要接口接收数组格式的请求体,直接传[[String: Any]]类型参数即可,不需要额外包装为字典
内容的提问来源于stack exchange,提问作者ridvan
相关产品推荐
相关产品推荐

