【发布时间】:2019-04-30 01:21:17
【问题描述】:
我正在使用 Xcode 10.2.1、iOS 12.1+、Swift 5
下面的函数应该读取一个归档值并返回它。 您可以看到以前的代码(unarchiveObject)在被弃用之前一直有效。
只要 'data' 的返回值不为零,代码就可以工作 - 这意味着之前已经保存了一个值。 但是,在新安装的应用程序中,这会崩溃,因为之前没有保存该值。
致命错误:在展开可选值时意外发现 nil
由于我不想预加载值,编写此函数以使其不会崩溃的正确方法是什么?
(似乎 NSKeyedUnarchiver.unarchiveTopLevelObjectWithData 现在也已在 iOS 12+ 中被弃用。正确的替代品是什么?)
func color(forKey defaultName: String) -> UIColor? {
var color: UIColor?
// Working code prior to Swift 5 and iOS 12
// if let colorData = data(forKey: defaultName) {
// color = NSKeyedUnarchiver.unarchiveObject(with: colorData) as? UIColor
// }
// Works unless NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data(forKey: defaultName)!) returns nil
do {
if let colorData = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data(forKey: defaultName)!) as? UIColor {
color = colorData
}
} catch {
//print("Couldn't read file.")
}
return color
}
【问题讨论】:
-
您可以像解决任何不应强制解包的可选选项一样解决它。
-
抱歉,但我不确定这对于作为 UIColor 的类型数据如何工作 - 你能更具体一点吗?