【问题标题】:Swift - Update Value of a specific item in a nested dictionarySwift - 更新嵌套字典中特定项目的值
【发布时间】:2019-05-18 11:27:39
【问题描述】:

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

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 个。

这就是我的字典的样子,如果这也有帮助的话

我已经搜索了其他问题,但我仍然可以解决。 非常感谢任何为我指明正确方向的帮助!

【问题讨论】:

    标签: arrays swift dictionary nested


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 ilya,我把它改成了一个类,但这不起作用。还有其他想法吗?谢谢
    【解决方案2】:

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

    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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 2012-08-08
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 2021-02-12
      相关资源
      最近更新 更多