我在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]]
提前感谢您在我的学习任务中提供的帮助!
答案 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)]