一尘不染

附加到[String:Any]字典结构中的数组

swift

组装传递给GRMustache.swift的数据有效载荷以渲染胡子模板时,我处于一种需要将数据附加到先前在字典中定义的数组的场景中。

我的数据结构开始于:

var data: [String: Any] = [
    "key1": "example value 1",
    "key2": "example value 2",
    "items": [
        // I need to append here later
    ]
]

items密钥对是一家集我需要一个循环内后追加。

要添加到data["items"]数组中,我正在尝试类似的方法:

for index in 1...3 {
    let item: [String: Any] = [
        "key": "new value"
    ]

    data["items"].append(item)
}

此错误,因为type的值Any?没有成员append,并且二进制运算符+=不能应用于type Any?和的操作数[String : Any]

这很有意义,因为我需要强制转换要附加的值。但是,我不能改变数组。

强制转换为数组时是否强制产生错误:

(data["items"] as! Array).append(item)

‘任何?’ 不能转换为’Array <_>’; 您的意思是使用“ as!” 强迫垂头丧气?

无法对类型为’Array <_>’的不可变值使用变异成员

似乎我的演员选错了;或者,也许我正在以错误的方式进行操作。

关于如何逐步填充的任何建议data["items"]


阅读 1048

收藏
2020-07-07

共1个答案

一尘不染

的类型data[Items]不是,Array但实际上是Array<[String: Any]>

您可以将其压缩为更少的步骤,但是我更喜欢多步骤的清晰度:

var data: [String: Any] = [
    "key1": "example value 1",
    "key2": "example value 2",
    "items": []
]

for index in 1...3 {

    let item: [String: Any] = [
        "key": "new value"
    ]

    // get existing items, or create new array if doesn't exist
    var existingItems = data["items"] as? [[String: Any]] ?? [[String: Any]]()

    // append the item
    existingItems.append(item)

    // replace back into `data`
    data["items"] = existingItems
}
2020-07-07