iOS Swift Как вы защищаете кодирование / декодирование TimeInterval для совместимости с NSSecureCoding? - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть переменная

var pausedTime: TimeInterval?

Я хочу закодировать и декодировать его с помощью NSSecureCoding

Пока у меня есть это для кодирования:

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

и это для декодирования, трактуя TimeInterval как Double:

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

Но это не работает и приводит к ошибке:

[ошибка] ошибка: исключение возникло во время многопоточной выборки *** - [NSKeyedUnarchiver decodeDoubleForKey:]: значение для ключа (pausedTime) не является 64-разрядным с плавающей точкой ({ "__NSCoderInternalErrorCode" = 4864; }) * 1 018 *

Может, кто-нибудь предоставит мне правильный способ безопасного кодирования / декодирования TimeInterval?

1 Ответ

0 голосов
/ 07 ноября 2018

Во-первых, TimeInterval - это в точности Double (это просто typealias). Это полезно знать, если вы ожидаете какой-либо специализации о 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")
...