【问题标题】:Can't update value of nested Dictionary无法更新嵌套字典的值
【发布时间】:2015-09-08 06:55:13
【问题描述】:

我正在尝试更新未知类型的复杂Dictionary 中的值,因为它包含Strings 和子字典。我的初始化函数代码如下。

这是我之前的Dictionary 的样子:

var methods = [
    "PUN": [
        "name": "Time of PUN",
        "params": ["FJ": 18, "IS": 17]
    ],
    "KHR": [
        "name": "Time KHR",
        "params": ["FJ": 15, "IS": 15]
    ],
    "LHR": [
        "name": "Time of LHR",
        "params": ["FJ": 19.5, "IS": 17.5 , "MG": 8.9]
    ]
]

这就是我想要动态实现的目标:

var methods = [
    "PUN": [
        "name": "Time of PUN",
        "params": ["FJ": 18, "IS": 17, "Offset": "0 min", "Midnight": "Standard"]
    ],
    "KHR": [
        "name": "Time KHR",
        "params": ["FJ": 15, "IS": 15, "Offset": "0 min", "Midnight": "Standard"]
    ],
    "LHR": [
        "name": "Time of LHR",
        "params": ["FJ": 19.5, "IS": 17.5 , "MG":8.9, "Offset": "0 min", "Midnight": "Standard"]
    ]
]

这是我的代码:

我从 defaultParams (Dictionary) 中获取额外的值并插入到 methods (Dictionary) 中。

var methods = [String: AnyObject]()
let defaultParams = ["Offset": "0 min", "Midnight": "Standard"]

init() { 
    methods["Punjab"] = [
        "name": "Punjab Time",
        "params": ["FJ": 18, "IS": 17]
    ]

    methods["Karachi"] = [
        "name": "Time of Karachi",
        "params": ["FJ": 15, "IS": 15]
    ]

    methods["Lahore"] = [
        "name": "Lahore City Time",
        "params": ["FJ": 19.5, "IS": 17.5 , "MG": 8.9]
    ]     

    for (methodName, methodValue) in methods {
        var params = methodValue["params"]!!

        for (defaultParamKey, defaultParamValue) in defaultParams {
            if params.objectForKey(defaultParamKey) == nil {
                // I am having problem with the line below, it says 
                // cannot asign a value of type String to a value of type AnyObject?!
                params[defaultParamKey] = defaultParamValue
            }
        }
    }
}

在初始化时,我只想通过使用变量 defaultParams 来检查字典变量 methods 中的缺失值。

【问题讨论】:

  • 什么应该去哪里?目前还不清楚。请详细说明您想要什么。
  • 为什么要投票 -1 我认为这个社区是为了帮助人们,还是只是为了批评和投票,如果有人不明白,我可以进一步解释。如果人们继续对这样的真实问题投反对票,那么让这个网站保持活力的意义何在。在来这里寻求帮助之前,我做了很多研究并花了很多时间。
  • 上面的init函数是被调用的。变量命名方法是我要在 init() 中修改的变量
  • 让我们用简单的语言说我想这样做:-- methods["params"]["Offset"] = "TEST" 。我基本上想为方法变量和相应的值添加一个额外的键
  • methods["params"] 中不存在“offset”,但我想将其放入并给它一个值“TEST”

标签: swift dictionary nested


【解决方案1】:

这有点令人费解,但确实有效:

class Test {
    var methods = [String: [String: AnyObject]]()
    let defaultParams = ["Offset": "0 min", "Midnight": "Standard"]

    init() {
        methods["Punjab"] = [
            "name": "Punjab Time",
            "params": ["FJ": 18, "IS": 17]
        ]

        methods["Karachi"] = [
            "name": "Time of Karachi",
            "params": ["FJ": 15, "IS": 15]
        ]

        methods["Lahore"] = [
            "name": "Lahore City Time",
            "params": ["FJ": 19.5, "IS": 17.5 , "MG": 8.9]
        ]

        for (methodName, methodValue) in methods {

            for (mKey, mValue) in methodValue {

                if mKey == "params" {

                    var pDic = mValue as! [String: AnyObject]

                    for (defaultKey, defaultValue) in defaultParams {

                        if !contains(pDic.keys, defaultKey) {

                            pDic[defaultKey] = defaultValue

                            methods[methodName]!["params"]! = pDic

                        }

                    }



                }

            }

        }
    }
}

let t = Test()
println(t.methods)

结果:

[卡拉奇:[参数:{ FJ = 15; 是 = 15; 午夜 = 标准; 偏移量=“0分钟”; },名称:卡拉奇时间],旁遮普:[参数:{ FJ = 18; 是 = 17; 午夜 = 标准; 偏移量=“0分钟”; },名称:旁遮普时间],拉合尔:[参数:{ FJ = "19.5"; IS = "17.5"; MG = "8.9"; 午夜 = 标准; 偏移量=“0分钟”; },名称:拉合尔市时间]]

【讨论】:

    【解决方案2】:

    您应该使用 if let 闭包而不是 == nil ,我不知道您要分配哪个值,但这种方法可行。

    if let value = params.objectForKey(defaultParamKey) as? String {
               params[defaultParamKey] = value
    }
    

    【讨论】:

    • 再次出现此错误:无法将“String”类型的值分配给“AnyObject?!”类型的值
    • 除此之外,您的上述代码仅在方法[“params”]中存在键时才会执行,而我的问题是我想在方法中添加缺少的键和值[ "params"] 通过将其与 defaultParams 进行比较,即这些 (["Offset": "0 min", "Midnight": "Standard"])
    猜你喜欢
    • 1970-01-01
    • 2021-08-20
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 2019-07-15
    • 2021-09-04
    相关资源
    最近更新 更多