gpt4 book ai didi

arrays - 使用 Enum 类型保存字典数组,NSCoding

转载 作者:搜寻专家 更新时间:2023-11-01 05:50:40 25 4
gpt4 key购买 nike

我一直在尝试弄清楚如何使用带有 NSCoding 的枚举类型来保存字典数组。

我有一个奖牌类型的枚举

enum Medal: String {
case Unearned = "NoMedal"
case Gold = "GoldMedal"
case Silver = "SilverMedal"
}

我的 GameData.swift 类中有一组包含奖牌类型的字典。

var medals: [[String: Medal]] = [
["1": .Unearned, "2": .Unearned, "3": .Unearned]
...
]

比起我在解码器方法中有这段代码

convenience required init?(coder decoder: NSCoder) {
self.init()

medals = decoder.decodeObjectForKey(Key.medals) as? [[String: Medal]] ?? medals
}

我认为这是导致我出现问题的编码器方法

// MARK: - Encode
func encodeWithCoder(encoder: NSCoder) {

encoder.encodeObject(medals as? AnyObject, forKey: Key.medals)
}

问题是重启时它没有保存/加载勋章数组,它一直重置为默认值。

这个我也试过

 encoder.encodeObject(medals as? [[String: Medal]], forKey: Key.medals)

它会导致编译器错误。

我也不能使用常规语法

 encoder.encodeObject(medals, forKey: Key.medals)

就像我对使用普通值(例如 [String: Int])的字典数组一样,因为编译器也会抛出错误

最佳答案

medals 不是 AnyObject,所以当您将它编码为 时? AnyObject 你得到 nil

仅仅因为枚举具有原始字符串值并不意味着您可以自动将其桥接到 [String:String]。你必须自己做。例如(使用 Airspeed Velocity's version of mapValues ):

convenience required init?(coder decoder: NSCoder) {
self.init()

if let medalStrings = decoder.decodeObjectForKey(Key.medals) as? [[String: String]] {
medals = medalStrings.map { $0.mapValues { Medal(rawValue: $0) ?? .Unearned } }
}

}

func encodeWithCoder(encoder: NSCoder) {
let medalStrings = medals.map { $0.mapValues { $0.rawValue } }
encoder.encodeObject(medalStrings, forKey: Key.medals)
}

关于arrays - 使用 Enum 类型保存字典数组,NSCoding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35482738/

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