【问题标题】:Encode enum with NSCoding使用 NSCoding 对枚举进行编码
【发布时间】:2016-12-24 09:12:47
【问题描述】:

我正在我的库中实现 NSCoding,但我需要序列化一个枚举变量,我无法将它传递给采用 AnyObject? 的函数。这将如何在 Swift 中完成?这是我的枚举:

enum ServerType {
  case PC
  case PE
}

另外,ServerType 不存在 toRaw()fromRaw()。我唯一可以访问的属性是hashValue,并且没有我可以访问的方法。

【问题讨论】:

  • 尝试编码 NSNumber(unsignedShort: enumvalue)
  • @Teddy 我收到错误消息:“参数标签 '(CUnsignedShort:)' 与任何可用的重载都不匹配”
  • 枚举值.rawvalue
  • @Teddy 不。仅限hashValue

标签: swift nscoding nscoder


【解决方案1】:

这类似于@Bennett 的回答,但您可以将它与NSNumber 一起使用,如图所示:

enum ServerType: UInt {
    case PC
    case PE
}

let someType: ServerType = .PE
NSNumber(value: someType.rawValue) // 1

【讨论】:

  • 也可以,但我只是注意到,对于我的代码,有一种情况应该是字符串。
  • 是的,但我也包括了这个,因为它有一些优点。您的解决方案允许重新排序但不重命名案例,但我的解决方案允许重命名但不重新排序我认为更有用的案例。您可以使用任一答案,只要确保将其中一个标记为正确(如果有效)即可。
  • 是的,但我正在将https://example.com/ 之类的路径更改为https://example.com/pchttps://example.com/pe,具体取决于值。如果是字符串,我可以说case PC = "pc"case PE = "pe",然后使用https://example.com/\(serverValue.rawValue)"。在模棱两可的情况下,这将起作用并且具有优势。
  • @Bennett 你仍然可以。只需:"https://example.com/\(someType)" 或者,在您的情况下,"https://example.com/\(serverValue)"
  • 但是那将是https://example.com/1(如果serverValue = .PE)而不是https://example.com/pe
【解决方案2】:

将您的代码更改为

enum ServerType : String {
  case PC
  case PE
}

您应该可以使用rawValue 参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多