You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:33:31