使用 Enum 类型保存字典数组,NSCoding
Save Array of dictionaries with Enum type, NSCoding
我一直在尝试弄清楚如何使用带有 NSCoding 的枚举类型来保存字典数组。
我有一个奖牌类型的枚举
enum Medal: String {
case Unearned = "NoMedal"
case Gold = "GoldMedal"
case Silver = "SilverMedal"
}
我的 GameData.swift class.
中有一系列带有奖章类型的字典
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)
}
问题是重启时它不是 saving/loading 勋章阵列,它一直重置为默认值。
这个我也试过了
encoder.encodeObject(medals as? [[String: Medal]], forKey: Key.medals)
它会导致编译器错误。
我也不能使用常规语法
encoder.encodeObject(medals, forKey: Key.medals)
就像我对使用普通值(例如 [String: Int])的字典数组一样,因为编译器也会抛出错误
medals
不是 AnyObject
,所以当你编码它时 as? 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 { [=10=].mapValues { Medal(rawValue: [=10=]) ?? .Unearned } }
}
}
func encodeWithCoder(encoder: NSCoder) {
let medalStrings = medals.map { [=10=].mapValues { [=10=].rawValue } }
encoder.encodeObject(medalStrings, forKey: Key.medals)
}
我一直在尝试弄清楚如何使用带有 NSCoding 的枚举类型来保存字典数组。
我有一个奖牌类型的枚举
enum Medal: String {
case Unearned = "NoMedal"
case Gold = "GoldMedal"
case Silver = "SilverMedal"
}
我的 GameData.swift class.
中有一系列带有奖章类型的字典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)
}
问题是重启时它不是 saving/loading 勋章阵列,它一直重置为默认值。
这个我也试过了
encoder.encodeObject(medals as? [[String: Medal]], forKey: Key.medals)
它会导致编译器错误。
我也不能使用常规语法
encoder.encodeObject(medals, forKey: Key.medals)
就像我对使用普通值(例如 [String: Int])的字典数组一样,因为编译器也会抛出错误
medals
不是 AnyObject
,所以当你编码它时 as? 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 { [=10=].mapValues { Medal(rawValue: [=10=]) ?? .Unearned } }
}
}
func encodeWithCoder(encoder: NSCoder) {
let medalStrings = medals.map { [=10=].mapValues { [=10=].rawValue } }
encoder.encodeObject(medalStrings, forKey: Key.medals)
}