Swift JSONDecoder解码(类型:从)无法识别我的数据

时间:2019-04-01 16:25:52

标签: ios swift xcode

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

 compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }

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

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

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
}
}

但是,当我尝试JSONDecoder.decode()时,代码无法通过内联强制转换识别我的第二个输入参数。如果我事先将其强制转换为 let je = JSONEncoder() let jsonData = try? je.encode(userRelate) let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(jsonData as! Data, toFile: FMS_UserRelate.ArchiveURL.path) ,那会很好。我想不出任何原因。我在Swift 4.2中使用Xcode 10.1。

screenshot showing inline casting does not work well with JSON decoder

1 个答案:

答案 0 :(得分:1)

请勿将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错误!