[英]How to create nested dictionary elements in Swift?
我想创建一个存储此变量:
["messageCode": API_200, "data": {
activities = (
{
action = 1;
state = 1;
}
);
messages = (
{
body = hi;
// ...
}
);
}, "message": ]
我所做的是这样的:
var fullDict: Dictionary<String, AnyObject> = [:]
fullDict["messageCode"] = "API_200" as AnyObject
var data: Dictionary<String, AnyObject> = [:]
fullDict ["data"] = data as AnyObject
这样是否正确,我如何添加活动?
我建议创建一个自定义模型:
struct Model {
var messageCode: String
var data: MyData
var message: String
}
struct MyData {
let activities: [Activity]
let messages: [Message]
}
struct Activity {
var action: Int
var state: Int
}
struct Message {
var body: String
// ...
}
因此,您可以将其用作:
let data = MyData(activities: [Activity(action: 1, state: 1)], messages: [Message(body: "hi")])
let myModel = Model(messageCode: "API_200", data: data, message: "")
但是,如果出于某种原因必须将其声明为字典,则可能是这样的:
let myDict: [String: Any] = [
"messageCode": "API_200",
"data": ["activities": [["action": 1, "state": 1]],
"messages": [["body": "hi"]]
],
"message": ""
]
这意味着myDict
是一个字典,包含:
messageCode
字符串。 data
作为嵌套字典,其中包含:
activities
字典数组( [String: Int]
数组)。 messages
的字典字典( [String: String]
数组)。 message
字符串。 您应该采用建模方法的最简单原因之一是,当要从myModel
读取数据时,您要做的就是使用点.
符号。 与将其用作字典不同,您必须区分其值,这在某些时候可能令人头疼。 例如,假设我们要访问数据消息数组中的第一个消息正文:
模型:
myModel.data.messages.first?.body
字典:
if let data = myDict["data"] as? [String: [[String: Any]]],
let messages = data["messages"] as? [[String: String]],
let body = messages.first?["body"] {
print(body)
}
由于您明确希望将其作为[String:AnyObject]
:
var dict: [String:AnyObject] = ["messageCode":"API_200" as AnyObject,
"data": ["activities": [["action":1,
"state":1]],
"messages": [["body":"hi"]]] as AnyObject,
"message": "" as AnyObject]
基本上,所有根值都应类型转换as AnyObject
还是很长的路要走:
//Activities is as Array of dictionary with Int values
var activities = [[String:Int]]()
activities.append(["action": 1,
"state": 1])
//Messages is an Array of string
var messages = [[String:String]]()
messages.append(["body" : "hi"])
//Data is dictionary containing activities and messages
var data = [String:Any]()
data["activities"] = activities
data["messages"] = messages
//Finally your base dictionary
var dict = [String:AnyObject]()
dict["messageCode"] = "API_200" as AnyObject
dict["data"] = data as AnyObject
dict["message"] = "" as AnyObject
print(dict)
解析它以取回数据将是地狱; 与所有类型强制转换和所有。
示例 (让捕获action
):
let action = ((dict["data"] as? [String:Any])?["activities"] as? [String:Int])?.first?.value
如您所见,您需要在每个级别进行转换。 这是在Swift中使用字典的问题。 太多的东西。
当然,您可以使用SwiftyJSON
类的第三方库将上述内容简化为:
let action = dict["data"]["activities"][0]["action"]
但是,您是否只想要像这样简单的依赖项?
如果定义了结构,则创建模型; 正如艾哈迈德·F ( Ahmad F)的答案所暗示的那样。 它将更具可读性,可维护性和灵活性。
...但是您问过,这就是使用纯Dictionary
元素的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.