gpt4 book ai didi

ios - swift 3 : Saving Array to UserDefaults Error - Count of Objects Differs from Count of Keys

转载 作者:行者123 更新时间:2023-11-30 12:27:07 36 4
gpt4 key购买 nike

我的应用程序因错误而崩溃:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSDictionary initWithObjects:forKeys:]: count of objects (0) differs from count of keys (1)

以下是我保存 var favoriteAppAnnotations = [Int: AppAnnotation]() 的方法:

let userDefaults = UserDefaults.standard
let favoritesData: Data = NSKeyedArchiver.archivedData(withRootObject: self.favoriteAppAnnotations)
userDefaults.set(favoritesData, forKey: "FAVORITES")
userDefaults.synchronize()

这是我加载它的方法:

self.favoriteAppAnnotations = [:]
let userDefaults = UserDefaults.standard
if let decoded = userDefaults.object(forKey: "FAVORITES") as? Data {
let favoritesArray = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Int: AppAnnotation] // THIS IS WHERE THE CRASH IS
if favoritesArray.isEmpty == false {
self.favoriteAppAnnotations = favoritesArray
}
}

AppAnnotation 符合 NSCoding,如下所示:

    class AppAnnotation: ParentAppAnnotation, NSCoding // Note: ParentAppAnnotation is NSObject but doe snot conform to NSCoding
{
open var placeId: Int?
open var placeName: String?
open var placeDescription: String?
override init() {
super.init()
}
init(placeId: Int, placeName: String, placeDescription: String) {
self.placeId = placeId
self.placeName = placeName
self.placeDescription = placeDescription
}
required convenience init?(coder decoder: NSCoder) {
guard let placeName = decoder.decodeObject(forKey: "placeName") as? String,
let placeDescription = decoder.decodeObject(forKey: "placeDescription") as? String
else { return nil }
self.init(placeId: decoder.decodeInteger(forKey: "placeId"),
placeName: placeName,
placeDescription: placeDescription)

}
func encode(with coder: NSCoder) {
coder.encodeCInt(Int32(self.placeId!), forKey: "placeId")
coder.encode(self.placeName, forKey: "placeName")
coder.encode(self.placeDescription, forKey: "placeDescription")
}
}

我放弃了问题所在。考虑保存数组的替代方法...例如转换为 JSON 字符串。
但我想了解当前的问题可能出在哪里。

最佳答案

强制解包时出现问题。

NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Int: AppAnnotation]

使用

NSKeyedUnarchiver.unarchiveObject(with: decoded) as? [Int: AppAnnotation]

查看方法定义:

open class func unarchiveObject(with data: Data) -> Any?

它返回可选值。

关于ios - swift 3 : Saving Array to UserDefaults Error - Count of Objects Differs from Count of Keys,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44049284/

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