首页 > 解决方案 > 如何使用 Swift 从嵌套结构中读取本地数据

问题描述

我正在使用以下函数保存和加载数据,并使用以下结构进行建模,但我无法读取 EntityDat 的数组,不确定是因为EntityModel Struct还是加载数据中的调用(let entityData =尝试 JSONDecoder().decode(EntityModel.self, from: loadedData) ) 不正确。

我希望我的加载函数返回一个属于他的父 EntityModel 的 EntityData 数组。(例如下面)

 EntityModel {
   {
    "client_name": "John",
    "rut": "70.605.045-5",
    "segment": "Empresa"
   },
   {
    "client_name": "Alex",
    "rut": "60.345.234-1",
    "segment": "Pyme"
   },
   {
    "client_name": "Alice",
    "rut": "12.426.434-5",
    "segment": "Empresa"
   },
}

我收到的当前输出是: EntityData: EntityModel(entidad: nil)

保存功能:

func saveEntityToCoreData2()-> Bool {
        var SavedItem:Bool = true

        var mDictionary : [String: Any] = [
                "client_name": self.clientNameFromCore,
                "rut": self.clientRutFromCore,
                "segment": self.segmentFromCore ]

        let jsonData = try! JSONSerialization.data(withJSONObject: mDictionary, options: [.prettyPrinted])
        let json = String(data: jsonData, encoding: String.Encoding.utf8)!
        print("Saved Entity Dictionary", json)

        if self.saveRutSwitchOn
        {
            SecureData.save(key: "entityData", data: json.data(using: .utf8)!)
        }
        SavedItem = self.saveRutSwitchOn

        return SavedItem
    }

加载功能:

func loadEntityToCoreData2() {
        if let loadedData = SecureData.load(key: "entityData") {
            do {
                let entityData = try JSONDecoder().decode(EntityModel.self, from: loadedData)
                print("EntityData: ", entityData)
            } catch {
                print(error.localizedDescription)
            }
        }
    }

结构:

//Entity Model
struct EntityModel: Codable {
    let entidad: [EntityData]!
}

struct EntityData: Codable {
    let client_name: String!
    let rut: String!
    let segment: String!
}

标签: swiftstructswift4

解决方案


正确的 json

[
   {
    "client_name": "John",
    "rut": "70.605.045-5",
    "segment": "Empresa"
   },
   {
    "client_name": "Alex",
    "rut": "60.345.234-1",
    "segment": "Pyme"
   },
   {
    "client_name": "Alice",
    "rut": "12.426.434-5",
    "segment": "Empresa"
   }
]


struct EntityModel: Codable {
  let clientName, rut, segment: String 
}

 let decoder = JSONDecoder()
 decoder.keyEncodingStrategy = .convertToSnakeCase
 let entityData = decoder.decode([EntityModel].self, from:data)

当你保存时,把它变成一个数组

var arr : [[String: Any]] = [[
            "client_name": self.clientNameFromCore,
            "rut": self.clientRutFromCore,
            "segment": self.segmentFromCore ]]

推荐阅读