首页 > 解决方案 > 如何在 Swift 中创建嵌套的字典元素?

问题描述

我想创建一个变量来存储它:

["messageCode": API_200, "data": {
    activities =     (
                {
            action = 1;
            state = 1;
        }
    );
    messages =     (
                {
            body = hi;
            // ...
        }
    );
}, "message": ]

我所做的是这样的:

var fullDict: Dictionary<String, AnyObject> = [:]
fullDict["messageCode"] = "API_200" as AnyObject

var data: Dictionary<String, AnyObject> = [:]
fullDict ["data"] = data as AnyObject

这种方式是否正确以及如何添加活动?

标签: swiftdictionary

解决方案


我建议去创建一个自定义模型:

struct Model {
    var messageCode: String
    var data: MyData
    var message: String
}

struct MyData {
    let activities: [Activity]
    let messages: [Message]
}

struct Activity {
    var action: Int
    var state: Int
}

struct Message {
    var body: String
    // ...
}

因此,您可以将其用作:

let data = MyData(activities: [Activity(action: 1, state: 1)], messages: [Message(body: "hi")])
let myModel = Model(messageCode: "API_200", data: data, message: "")

但是,如果您出于某种原因必须将其声明为字典,则可能是这样的:

let myDict: [String: Any] = [
                            "messageCode": "API_200",
                             "data": ["activities": [["action": 1, "state": 1]],
                                      "messages": [["body": "hi"]]
                                     ],
                             "message": ""
                            ]

这意味着这myDict是一个字典包含:

  • messageCode细绳。
  • data作为嵌套字典,其中包含:
    • activities字典数组(数组[String: Int])。
    • messages字典数组(数组[String: String])。
  • message细绳。

您应该使用建模方法的最简单的原因之一是,在读取 from 时myModel,您所要做的就是使用点.符号。与将其用作字典不同,您必须对它的值进行大小写,这在某些方面可能会让人头疼。例如,假设我们要访问数据消息数组中的第一个消息体:

模型:

myModel.data.messages.first?.body

字典:

if let data = myDict["data"] as? [String: [[String: Any]]],
   let messages = data["messages"] as? [[String: String]],
   let body = messages.first?["body"] {

    print(body)
}

推荐阅读