我有一个符合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。
答案 0 :(得分:1)
请勿将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
错误!