ios - 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 一起使用。
解决方案
不要NSKeyed(Un)Archiver
与Codable
协议一起使用。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
错误!
推荐阅读
- regex - 使用linux终端在.txt中查找animal-060、animal-061、animal-062 ...、animal-069
- java - 将图片着色为标志但出现错误:无法解析为变量
- mysql - MySQL function to to evaluate a string as integer based on array of data
- sql - Getting Table Results based on a Start and End Date using a single date
- mysql - MySQL触发器增加/减少其他表中的值
- postgresql - Update primary keys in multiple tables using PostgreSQL
- excel - 如何修复 Excel VBA 脚本中的运行时错误 91
- python - Adding rows to CSV sorted by ID in Python without reading whole file into memory
- c - _Static_assert 替换以在 C 中显示值
- vue.js - 这个 eslint 规则的名称是什么:将 `⏎········ 替换为 `?