ios - Swift:如何以枚举为键对 HashMap 进行编码?

标签 ios swift enums encode multipeer-connectivity

我有这样的枚举:

   enum Direction : String {
      case EAST  = "east"
      case SOUTH = "south"
      case WEST  = "west"
      case NORTH = "north"
    }

我有一个名为 result 的变量,它是一个使用这些枚举方向作为键的 HashMap 。

var result = [Direction:[String]]()

我尝试对该对象进行编码并通过多点框架发送到另一端。但是,它在编码器处失败。

aCoder.encode(self.result, forKey: "result")

错误说: “编码(使用aCoder:NSCoder) *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[_SwiftValueencodeWithCoder:]:无法识别的选择器发送到实例 0x17045f230”

如何编码这个 HashMap ?

谢谢。

最佳答案

正如 JAL 评论中所述,NSCoding 功能基于 Objective-C 运行时,因此您需要将字典转换为可安全转换为 NSDictionary 的内容。

例如:

func encode(with aCoder: NSCoder) {
    var nsResult: [String: [String]] = [:]
    for (key, value) in result {
        nsResult[key.rawValue] = value
    }
    aCoder.encode(nsResult, forKey: "result")
    //...
}
required init?(coder aDecoder: NSCoder) {
    let nsResult = aDecoder.decodeObject(forKey: "result") as! [String: [String]]
    self.result = [:]
    for (nsKey, value) in nsResult {
        self.result[Direction(rawValue: nsKey)!] = value
    }
    //...
}

关于ios - Swift:如何以枚举为键对 HashMap 进行编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41367796/

相关文章:

java - 从第 5 版开始, 'enum' 是关键字,不能用作标识符

ios - 验证文本字段Swift 3

arrays - 如何使用 Firebase 数据库进行分页?

ios - 检查是否按下了标注 View (mapBox iOS SDK)

ios - SwiftUI 中的淡入淡出图像似乎不起作用

ios - 我如何创建一个 plist,我可以在我的应用程序中很好地访问 array -> dictionary -> dictionary -> array -> mYClassInstances in swift?

c# - 动态生成、分组和绑定(bind)单选按钮到枚举

c - 用数组常量定义的枚举

ios - 获取在 VNDetectTextRectanglesRequest 完成处理程序上的 VNImageRequestHandler 中使用的 cvPixelBuffer

ios - 使用 QtCreator 构建应用程序 iOS 时出错