在swift

时间:2016-05-23 15:24:16

标签: ios swift collections

我在Swift中练习收藏。实际上,我将来自在线JSON源的数据存储到字典/数组中。我试图将新元素添加到以下集合中:

testDict1: Dictionary<String,Dictionary<Int,Dictionary<String, AnyObject>>>

我使用以下元素初始化它(它可能是一个空数组):

testDict1 =  ["fireMagic":[
              0:["name":"Basic attack","damage":100],
              1:["name":"Super attack","damage":200, "lvlReq": 20],
              2:["name":"Mega attack","damage":400, "lvlReq": 40]]]

我想&#34;更新&#34; testDict1中的数据(如果需要,替换并添加新行)来自另一个数组,例如:

testDict1 =  ["fireMagic":[
              0:["name":"Basic attack","damage":100],
              1:["name":"Super attack","damage":200, "lvlReq": 20],
              2:["name":"Mega attack","damage":400, "lvlReq": 40]
              3:["name":"Insane attack","damage":1000, "lvlReq": 60]]]

问题1

如何将下面的元素追加到testDict1:

3:["name":"Insane attack","damage":1000, "lvlReq": 60] //with "FireMagic" as a key.

我面临着不同的错误,我无法使其发挥作用。我确信它必须比我尝试的方式更复杂,你可能有解决方案来结束我的痛苦:)

问题2

如果我需要添加其他权力,例如&#34; WaterMagic&#34;我该怎么办?具有与&#34; FireMagic&#34;相同的结构在testDict1中。

testDict1 =  ["fireMagic":[
             0:["name":"Basic attack","damage":100],
             1:["...":"...","...":"..."]],
             ["waterMagic":[
             0:["name":"Basic attack","damage":100]]

提前感谢您在我的学习任务中提供的帮助!

1 个答案:

答案 0 :(得分:2)

Q1:

不安全:

testDict1["fireMagic"]![3] = ["name":"Insane attack","damage":1000, "lvlReq": 60]

安全:

if let _ = testDict1["fireMagic"] {
    testDict1["fireMagic"]![3] = ["name":"Insane attack","damage":1000, "lvlReq": 60]
}

安全而简单(感谢@dfri):

testDict1["fireMagic"]?[3] = ["name":"Insane attack","damage":1000, "lvlReq": 60]

Q2:

testDict1["waterMagic"] = [0:["name":"Test attack","damage":100]]

但我建议使用数组,枚举和结构而不是字典,处理起来要简单得多,而且它也更安全:

enum MagicType {
    case Water
    case Fire
}

struct Magic {
    let magic: MagicType
    let name: String
    let damage: Int
    let lvlReq: Int?
}

创建一个对象数组:

var fireMagics = [Magic(magic: .Fire, name: "Basic attack", damage: 100, lvlReq: nil), Magic(magic: .Fire, name: "Super attack", damage: 200, lvlReq: 20), Magic(magic: .Fire, name: "Mega attack", damage: 100, lvlReq: 40)]

通过索引访问数组中的对象:

fireMagics[0]
fireMagics[1]
fireMagics[2]

将对象添加到数组中:

fireMagics.append(Magic(magic: .Fire, name: "Insane attack", damage: 1000, lvlReq: 60))

创建不同类型的Magic对象:

var waterMagics = [Magic(magic: .Water, name: "Test attack", damage: 100, lvlReq: nil)]