NSKeyedArchiver 不会存档以枚举为值的简单字典
NSKeyedArchiver will not archive simple dictionary with enum as value
我正在尝试使用 NSKeyedArchiver
到 "archive" 一个简单的字典。键是 String
类型,值是 enum
.
以下示例说明了我正在尝试做的事情:
import Foundation
enum Friend: String, Codable {
case Ben, Max
}
let friends: [String: Any] = [ "bestFriend" : Friend.Ben ]
let archivedFriends = NSKeyedArchiver.archivedData(withRootObject: friends)
可以将此代码复制到 playground 中,结果将出现以下错误:
error: Execution was interrupted, reason: signal SIGABRT.
遗憾的是,我无法复制堆栈跟踪,所以我不得不创建一个屏幕截图:
为了测试 enum
确实是问题所在,我将代码更改为以下内容:
import Foundation
let friends: [String: Any] = [ "bestFriend" : "Ben" ]
let archivedFriends = NSKeyedArchiver.archivedData(withRootObject: friends)
这行得通,所以问题是:
在我的第一个代码示例中我缺少什么来让 NSKeyedArchiver
使用给定的字典?
使用原始值而不是直接使用枚举。
let friends: [String: Any] = [ "bestFriend" : Friend.Ben.rawValue]
let archivedFriends = NSKeyedArchiver.archivedData(withRootObject: friends)
我正在尝试使用 NSKeyedArchiver
到 "archive" 一个简单的字典。键是 String
类型,值是 enum
.
以下示例说明了我正在尝试做的事情:
import Foundation
enum Friend: String, Codable {
case Ben, Max
}
let friends: [String: Any] = [ "bestFriend" : Friend.Ben ]
let archivedFriends = NSKeyedArchiver.archivedData(withRootObject: friends)
可以将此代码复制到 playground 中,结果将出现以下错误:
error: Execution was interrupted, reason: signal SIGABRT.
遗憾的是,我无法复制堆栈跟踪,所以我不得不创建一个屏幕截图:
为了测试 enum
确实是问题所在,我将代码更改为以下内容:
import Foundation
let friends: [String: Any] = [ "bestFriend" : "Ben" ]
let archivedFriends = NSKeyedArchiver.archivedData(withRootObject: friends)
这行得通,所以问题是:
在我的第一个代码示例中我缺少什么来让 NSKeyedArchiver
使用给定的字典?
使用原始值而不是直接使用枚举。
let friends: [String: Any] = [ "bestFriend" : Friend.Ben.rawValue]
let archivedFriends = NSKeyedArchiver.archivedData(withRootObject: friends)