Конвертировать JSON в массив свойств

У меня есть файл JSON:

{
  "sceneSettings":[
    {
      "showsStatistics":false,
      "autoenablesDefaultLighting":false,
      "antialiasingMode":"multisampling4X",
      "debugOptions":[
        {
          "showPhysicsShapes":false,
          "showBoundingBoxes":false,
          "showLightInfluences":false,
          "showLightExtents":false,
          "showPhysicsFields":false,
          "showWireframe":false,
          "renderAsWireframe":false,
          "showSkeletons":false,
          "showCreases":false,
          "showConstraints":false,
          "showCameras":false
        }
      ]
    }
  ]
}

Я хочу получить debugOptions и вернуть их в виде массива SCNDebugOptions для использования в ARkit.

У меня сейчас есть структура DebugOption:

struct DebugOption: Decodable, Loopable {
    let showPhysicsShapes: Bool = false
    let showBoundingBoxes: Bool  = false
    let showLightInfluences: Bool = false
    let showLightExtents: Bool = false
    let showPhysicsFields: Bool = false
    let showWireframe: Bool = false
    let renderAsWireframe: Bool = false
    let showSkeletons: Bool = false
    let showCreases: Bool = false
    let showConstraints: Bool = false
    let showCameras: Bool = false
}

И я декодирую файл JSON с помощью:

class SceneSettingsFactory {

    func parseJSON() -> SceneSettings? {
        if let url = Bundle.main.url(forResource: "ModelsData", withExtension: "json") {
            do {
                let data = try Data(contentsOf: url)
                let decoder = JSONDecoder()
                let jsonData = try decoder.decode(ResponseData.self, from: data)

                return jsonData.sceneSettings
            } catch {
                print("error:\(error)")
            }
        }
        return nil
    }
}

struct ResponseData: Decodable {
    var model: [Model]
    var sceneSettings: SceneSettings
}

struct SceneSettings: Decodable {
    let showsStatistics: Bool = false
    let autoenablesDefaultLighting: Bool = false
    let antialiasingMode: AntialiasingOption = .none
    let debugOptions: DebugOption
}

Я не уверен, как эффективно преобразовать значения Bool в массив их соответствующих SCNDebugOptions если их значение верно.

Я начал с добавления следующего в мою структуру DebugOption, но это не лучший способ.

func getOptionArray() -> [SCNDebugOptions] {
    var optionsArray = [SCNDebugOptions]()
    let allPropertyValues = self.allProperties
    allPropertyValues.forEach { property in
        guard let valueIsTrue = property.value as? Bool else { return }
        let propertyAsOption = keyStringAsOption(property.key)
        if valueIsTrue {
            optionsArray.append(propertyAsOption)
        }
    }
}

private func keyStringAsOption(_ propertyString: String) -> SCNDebugOptions {
    switch propertyString {
        case ""
    }
}

Любое понимание или помощь были бы великолепны, поскольку это кажется долгим.

1 ответ

struct ResponseData: Decodable {
    var model: [Model]
    var sceneSettings: SceneSettings
}

Похоже, неправильно. Ваш sceneSettings является массивом, но ваш тип SceneSettings, Я предлагаю вам создать что-то вроде этого:

struct ResponseData: Decodable {
    var model: [Model]
    var sceneSettings: [SceneSetting]
}

Также вы должны обновить свой SceneSettings структура для SceneSetting

Другие вопросы по тегам