Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Swift从嵌套结构读取本地数据_Swift_Struct_Swift4 - Fatal编程技术网

如何使用Swift从嵌套结构读取本地数据

如何使用Swift从嵌套结构读取本地数据,swift,struct,swift4,Swift,Struct,Swift4,我正在使用以下函数保存和加载数据,并使用以下结构进行建模,但我无法读取EntityDat的数组,不确定这是否是由于EntityModel结构或加载数据中的调用(让entityData=try JSONDecoder().decode(EntityModel.self,from:loadedData))这是不正确的 我希望我的load函数返回属于其父EntityModel的EntityData数组。(如下文) 我收到的电流输出是: EntityData:EntityModel(entidad:ni

我正在使用以下函数保存和加载数据,并使用以下结构进行建模,但我无法读取EntityDat的数组,不确定这是否是由于EntityModel结构或加载数据中的调用(让entityData=try JSONDecoder().decode(EntityModel.self,from:loadedData))这是不正确的

我希望我的load函数返回属于其父EntityModel的EntityData数组。(如下文)

我收到的电流输出是:
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)
            }
        }
    }
加载函数:

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!
}
正确的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 
}


保存时,将其设置为如下数组

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

JSON无效。不相关但从不将符合
Codable
的结构成员声明为隐式未包装可选。不要那样做。将它们声明为非可选(在您的情况下建议)或常规可选(
)。不要在
解码错误
捕获块中打印
错误。localizedDescription
。始终打印
错误
@vadian谢谢您的输入。你介意解释一下最后的建议吗?为什么打印错误不好。localizedDescription?因为出现了
错误。localizedDescription
您得到的是泛型,无法读取数据,因为它的消息格式错误。使用
error
可以获得关于错误的确切类型和位置的全面错误消息。