iOS Swift 您如何保护 Encode/Decode TimeInterval 以与 NSSecureCoding 兼容?

iOS Swift How do you Secure Encode/Decode a TimeInterval for compatibility with NSSecureCoding?

我有一个变量

var pausedTime: TimeInterval?

我想用NSSecureCoding

对其进行编码和解码

到目前为止我有这个用于编码:

aCoder.encode(pausedTime, forKey: "Pause")

这用于解码,将 TimeInterval 视为 Double:

if aDecoder.containsValue(forKey: "Pause") {
    pausedTime = aDecoder.decodeDouble(forKey: "Pause")
}

但这不起作用并导致错误:

[error] fault: exception raised during multi-threaded fetch *** -[NSKeyedUnarchiver decodeDoubleForKey:]: value for key (pausedTime) is not a 64-bit float ({ "__NSCoderInternalErrorCode" = 4864; })

有人可以向我提供 正确的 方法来保护 encode/decode TimeInterval 吗?

首先,TimeInterval 恰好是一个 Double(它只是一个类型别名)。如果您期望 TimeInterval 有任何特殊性,了解这一点很有用。没有。

但是,在您的情况下,pausedTime 不是 TimeInterval。这是一个TimeInterval?。您可能最终会调用 encode(Any?, forKey:) 重载,这可能会将您的替身装箱成 NSNumber.

要解决这个问题,您应该确保编码的是 Double。例如:

if let pausedTime = pausedTime {
   aCoder.encode(pausedTime, forKey: "Pause")
}

aCoder.encode(pausedTime ?? 0.0, forKey: "Pause")