-
Ваша подкатегория должна быть тоже массивом объектов ваше подструктуры, а не просто массивом, например таким
struct Subcategory {
var id: Int
var iconImage: Data
var sortOrder: Int
var name: String
var type: String // лучше Enum тут использовать
init?(data: NSDictionary) {
...
}
}
var subcategories: [Subcategory]
-
В инициализаторе Category вы извлечёте из data["subcategories"]
во временный массив subCat
массив словарей [NSDictionary].
let subCat = data["subcategories"] as? [NSDictionary]
-
По этому массиву пройдётесь циклом и создадите массив ваших подструктур
var tempArray = [Subcategory]()
subCat.forEach { dictItem in
let subCategoryItem = Subcategory(data: dictItem)
tempArray.append(subCategoryItem)
}
-
self.subcategories = tempArray
PS по нициализатору.
Если у вас предполагается сценарий, что одного параметра у Category в джейсоне может не оказаться, или потом предполагается добавить параметров при обновлении, то инициализатор через guard
плохая идея: при отсутствии одного из параметров (например нового параметра в модели из обновы) объект не создаться и юзер не увидит данные.
Тут я бы использовал конструкцию через if else
с использованием временных переменных в инициализаторе с установкой дефолтных значений, если параметр нельзя извлечь. Пример:
init(dictionary: NSDictionary) {
var name: String
var comment: String
var lastStrike: Date
var visible: Bool
var userImage: Data
if let nameInit = dictionary.object(forKey: "name") as? String { name = nameInit } else { name = "" }
if let commentInit = dictionary.object(forKey: "comment") as? String { comment = commentInit } else {comment = "" }
if let lastStrikeInit = dictionary.object(forKey: "lastStrike") as? Date {lastStrike = lastStrikeInit} else {lastStrike = Date()}
if let visibleInit = dictionary.object(forKey: "visible") as? Bool {visible = visibleInit} else {visible = true}
if let userImageInit = dictionary.object(forKey: "userImage") as? Data {
userImage = userImageInit
} else {
userImage = Data()
}
self.name = name
self.comment = comment
self.lastStrike = lastStrike
self.visible = visible
self.userImage = userImage
}
Это даст вам возможность в любой момент добавлять в модель новые впараметры и устанавливать дефолтные значения, если их нет в модели (в блоке else)