Я бы предложил перейти к созданию пользовательской модели:
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)
}