Конвертировать 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