首页 > 解决方案 > Swift JSONDecoder decode(type:from) 无法识别我的数据

问题描述

我有一个符合 Codable 协议的数据模型,其组件都符合 Codable 协议。

class FMS_UserRelate : Codable {

//MARK: Archiving Paths
static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
static let ArchiveURL = DocumentsDirectory.appendingPathComponent("FMS_UserRelate.plist")

// MARK: Properties
var consumers: [FMS_Consumer]
var userId: String

//MARK: Initialization
init?(consumers: [FMS_Consumer], userId: String) {
    .
    .
    .

    // Initialize stored properties.
    .
    .
    .
}

// MARK: Codable
enum CodingKeys : String, CodingKey {
    case consumers
    case userId
}
}

在我的应用程序中,我将数据保存到磁盘并稍后加载。为此,我使用 NSKeyedArchiver 和 JSON 编码器/解码器。

这是我用来保存的。它工作正常。

    let je = JSONEncoder()
    let jsonData = try? je.encode(userRelate)
    let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(jsonData as! Data, toFile: FMS_UserRelate.ArchiveURL.path)

但是,当我尝试 JSONDecoder.decode() 时,代码无法通过内联转换识别我的第二个输入参数。Data如果我事先进行铸造,它会很好用。我想不出任何原因。我将 Xcode 10.1 与 Swift 4.2 一起使用。

显示内联转换的屏幕截图不适用于 JSON 解码器

标签: iosswiftxcode

解决方案


不要NSKeyed(Un)ArchiverCodable协议一起使用。NSKeyedArchiver属于NSCoding哪个是另一个故事。

只写编码数据

do {
    let jsonData = try JSONEncoder().encode(userRelate)
    try jsonData.write(to: FMS_UserRelate.ArchiveURL)
} catch { print(error) }

并将其读回(函数移交潜在的错误)

private func loadUserRelateUsingCodable() throws -> FMS_UserRelate {
    let jsonData = try Data(contentsOf: FMS_UserRelate.ArchiveURL)
    return try JSONDecoder().decode(FMS_UserRelate.self, from: jsonData)
}

笔记:

永远不要忽略Encoding/Decoding错误!


推荐阅读