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

如何在不使用Any的情况下构建可预测的嵌套字典数据结构

优化Swift字典结构的方案

完全可以用struct来优化这个结构,既保留顶层键数量不固定的灵活性,又获得类型安全的好处。具体做法是为每个顶层键对应的内容定义struct,然后用[String: YourStruct]代替原来的[String: Any]。

1. 定义结构化的类型

先给固定的嵌套结构定义两个遵循Codable的struct(方便后续生成JSON):

struct Extras: Codable {
    let task: String
}

struct TaskItem: Codable {
    let message: String
    let extras: Extras
}

Codable协议默认支持JSON序列化/反序列化,刚好匹配你后续生成JSON的需求。

2. 重构字典类型

把原来的[String: Any]替换成[String: TaskItem],初始化时直接使用struct实例:

let myDict: [String: TaskItem] = [
    "first": TaskItem(message: "qqq", extras: Extras(task: "first")),
    "second": TaskItem(message: "www", extras: Extras(task: "second")),
    "third": TaskItem(message: "eee", extras: Extras(task: "third"))
]

3. 简化初始化(可选)

如果觉得每次手动创建Extras麻烦,可以给TaskItem加一个便捷初始化方法,自动关联顶层键和task值:

extension TaskItem {
    init(key: String, message: String) {
        self.message = message
        self.extras = Extras(task: key)
    }
}

这样初始化字典会更简洁:

let myDict: [String: TaskItem] = [
    "first": TaskItem(key: "first", message: "qqq"),
    "second": TaskItem(key: "second", message: "www"),
    "third": TaskItem(key: "third", message: "eee")
]

为什么这样做?

  • 类型安全:再也不用处理Any类型的强制转换,访问属性时直接用myDict["first"]?.message就能得到String类型,编译器会帮你检查类型错误。
  • 灵活性保留:[String: TaskItem]依然支持动态添加、删除顶层键,完全满足你键数量不固定的需求。
  • JSON友好:因为struct遵循Codable,后续生成JSON时可以直接用JSONEncoder序列化,无需额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:40:17