gpt4 book ai didi

ios - 为什么 `NSKeyedUnarchiver` 无法解码 `Date`

转载 作者:行者123 更新时间:2023-11-29 05:13:55 25 4
gpt4 key购买 nike

最近,我使用 NSKeyedArchiverNSKeyedUnarchiver 处理 iOS 上的持久性问题。但我遇到了一些问题。

代码如下:

import Foundation

class Model {
static let instance = Model()
static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
static let TestArchiveURL = DocumentsDirectory.appendingPathComponent("t")

static func getInstance() -> Model {
return instance
}
var str = "String"
var date = Date()

func save() {
let coder = NSKeyedArchiver(requiringSecureCoding: false)
coder.encode(str, forKey: ModelPropertyKey.str)
coder.encode(date, forKey: ModelPropertyKey.date)
do {
try coder.encodedData.write(to: Model.TestArchiveURL)
} catch {
print("error write to file: " + error.localizedDescription)
}

do {
let data = try Data(contentsOf: Model.TestArchiveURL)
let decoder = try NSKeyedUnarchiver(forReadingFrom: data)
let strGot = decoder.decodeObject(forKey: ModelPropertyKey.str) as? String
let dateGot = decoder.decodeObject(forKey: ModelPropertyKey.date) as? Date
print("\(String(describing: strGot)) \(String(describing: dateGot))")
} catch {
print("Error read from file")
}

}
}

我使用encode(:forKey:)对数据进行编码,并使用encodedData.write(to:)获得持久性。然后我尝试使用 NSKeyedUnarchiver(forReadingFrom:)decodeObject(forKey:) 从磁盘读取数据。但此策略适用于 String,但不适用于 Date打印输出:

Optional("String") nil

我想知道为什么会发生这种情况。

最佳答案

您需要指定要尝试解码的对象类型,并且由于您正在解码 Date 对象,因此您需要了解 NSKeyedArchiverNSKeyedUnarchiver > 会将您的 Date Swift 对象桥接到 NSDate Objective-C 对象,以实现 swift 和 obj-c 之间的兼容性,因为 NSKeyedArchiver 使用 NSCodingDate 不符合 NSCoding

为此,请更改解码方式,如下所示

let dateGot = decoder.decodeObject(of: NSDate.self, forKey: ModelPropertyKey.date)! as Date

但是我建议您使用带有 JSONEncoderJSONDecoder 的 swift Codable 协议(protocol),它们有一个非常好的 dateDecodingStrategy code> 允许在编码和解码时指定自定义日期格式化程序,并且它们还支持直接解码 Date 对象,而无需桥接到 obj-c NSDate ,这在您尝试发送时非常有用您的对象作为 json 有效负载或通过网络调用对其进行解码

这是一个例子

let encoder = JSONEncoder()
let formatter = DateFormatter()
formatter.dateStyle = .full
formatter.timeStyle = .short
encoder.dateEncodingStrategy = .formatted(formatter)

let data = try? encoder.encode(Date())

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(formatter)
let newDate = try? decoder.decode(Date.self, from: data!)

关于ios - 为什么 `NSKeyedUnarchiver` 无法解码 `Date`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59388504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com