Swift-更新嵌套字典中特定项目的值

时间:2018-12-18 04:23:12

标签: arrays swift dictionary nested

我有一个表格视图,每个单元格都打算链接到字典中的数组。

var buttonAction : [String: [ButtonAction]] = [:]

下面是buttonAction的结构

struct ButtonAction: Codable {
var action: String
var array_linked_of_buttons: [[String:String]]

init(action: String, array_linked_of_buttons: [[String:String]]) {
 self.action = action
 self.array_linked_of_buttons = array_linked_of_buttons
   }  
}

解释整个代码有点复杂,但是当我将两个按钮连接在一起时,我可以获得变量“ singleAction”的数据,然后可以将其添加到按钮动作字典“ array_linked_of_buttons”中。

let singleAction = [linkedButtonUUID: connectorMarker.UUIDpic.uuidString, linkedButtonCategory: "", linkedButtonName: connectorMarker.name]

                let mainMarkerAction = mainMarker.buttonAction["button actions array"]!

                    for existingMarker in mainMarkerAction {
                        actionArray.append(existingMarker)
                    }

                    var actionSub = actionArray[indexRowTag].array_linked_of_buttons
                    if let addAction = actionSub.filter({$0[linkedButtonUUID] == connectorMarker.UUIDpic.uuidString}).first {
                        print("MARKER Exists", addAction)
                    } else {
                        actionSub.append(singleAction)
                        print("UPDATED MARKER", actionSub)
                    }

                    let action = ButtonAction(action: actionArray[indexRowTag].action, array_linked_of_buttons: actionSub)


//ISSUE--?? mainMarker.buttonAction.updateValue(VALUE forKey: "button actions array")

                    saveData()

我可以锻炼字典中的哪些项目需要编辑,但是如何更新该特定值?我真的很困惑,它只是创建了一个新项目,但我想更新上一​​个项目。

因此,例如,我想添加项目0的“ array_linked_buttons”,并添加4个项目,而不是3个。

如果这也有帮助,这就是我的字典的样子 enter image description here

我搜索了其他问题,但仍可以解决。 非常感谢您向我指出正确的方向!

2 个答案:

答案 0 :(得分:0)

发生复制而不是更改值的原因,是因为您将struct用于ButtonAction,它具有值的语义,并在分配给任何变量时快速创建副本。

您需要改用class。类具有引用语义,因此它不会在分配变量时创建新实例,因此您将能够更新所需实例的属性。

答案 1 :(得分:0)

我知道我正在更新主字典数组,而不是嵌套数组。 下面的代码是我最后使用的代码。

let singleAction = [linkedButtonUUID: connectorMarker.UUIDpic.uuidString, linkedButtonCategory: "", linkedButtonName: connectorMarker.name]

                var mainMarkerAction = mainMarker.buttonAction["button actions array"]!

                    for existingMarker in mainMarkerAction {
                        actionArray.append(existingMarker)
                    }

                    var actionSub = actionArray[indexRowTag].array_linked_of_buttons
                    if let addAction = actionSub.filter({$0[linkedButtonUUID] == connectorMarker.UUIDpic.uuidString}).first {
                        print("MARKER HERE", addAction)
                    } else {
                        actionArray[indexRowTag].array_linked_of_buttons.append(singleAction)
                    }

                    mainMarkerAction[indexRowTag] = actionArray[indexRowTag]