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

Swift字典表达式歧义错误排查及指定学校学生数据提取

排查并修正Swift嵌套数组字典的歧义错误及提取指定学校学生数据

错误原因分析

  • 数组结构类型不匹配:你将school声明为[[String:Any]](数组元素为字典),但实际初始化时是三层嵌套数组([[[String:Any]]]),每个学校数据被额外包裹了一层数组,导致后续取值时类型转换出现歧义。
  • 目标学校筛选逻辑缺失:循环中未做学校名称判断,直接遍历所有数据,无法精准提取"motherland"的学生信息。
  • 键名不统一:部分字典使用roll_number,部分使用roll-number,虽不是直接引发歧义的原因,但会影响后续取值的一致性。

修正后的代码

// 修正数组类型以匹配实际嵌套结构,同时统一键名提升可读性
var school: [[[String: Any]]] = [
    [[
        "schoolName": "devashya",
        "address": "new_nikol",
        "students": [
            ["name": "chirag", "rollNumber": "10"],
            ["name": "hiren", "rollNumber": "20"],
            ["name": "roshan", "rollNumber": "30"]
        ]
    ]],
    [[
        "schoolName": "sankalpschool",
        "address": "nikol",
        "students": [
            ["name": "keyur", "rollNumber": "40"],
            ["name": "mukesh", "rollNumber": "50"],
            ["name": "ravi", "rollNumber": "60"]
        ]
    ]],
    [[
        "schoolName": "motherland",
        "address": "naroda",
        "students": [
            ["name": "veer", "rollNumber": "70"],
            ["name": "nirav", "rollNumber": "80"],
            ["name": "rizvan", "rollNumber": "90"]
        ]
    ]],
    [[
        "schoolName": "vip",
        "address": "newnikol",
        "students": [
            ["name": "vikky", "rollNumber": "100"],
            ["name": "alpesh", "rollNumber": "110"],
            ["name": "raavi", "rollNumber": "120"]
        ]
    ]],
    [[
        "schoolName": "chanakya",
        "address": "sardarchowk",
        "students": [
            ["name": "mayur", "rollNumber": "130"],
            ["name": "vrinkesh", "rollNumber": "140"],
            ["name": "annav", "rollNumber": "150"]
        ]
    ]]
]

let targetSchool = "motherland"

for schoolGroup in school {
    // 取出每组中唯一的学校字典
    guard let schoolDict = schoolGroup.first else { continue }
    // 校验是否为目标学校
    guard let schoolName = schoolDict["schoolName"] as? String, schoolName == targetSchool else { continue }
    // 安全提取并打印学生数据
    if let students = schoolDict["students"] as? [[String: Any]] {
        print("=== \(targetSchool) 学校学生数据 ===")
        for student in students {
            print("姓名: \(student["name"] ?? "未知"), 学号: \(student["rollNumber"] ?? "未知")")
        }
    }
}

核心修正点

  1. 类型匹配:将school的类型修正为[[[String: Any]]],与实际三层嵌套结构一致,消除类型歧义。
  2. 精准筛选:新增学校名称判断逻辑,只处理目标学校"motherland"的数据。
  3. 键名统一:把roll_number/roll-number统一为rollNumber,school1等改为schoolName,提升代码可读性和维护性。
  4. 安全取值:使用guard let和if let做类型转换与空值校验,避免运行时崩溃。

内容的提问来源于stack exchange,提问作者bharti_____

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:01:08