首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Any转换为RawRepresentable where RawValue ==字符串

将Any转换为RawRepresentable where RawValue ==字符串
EN

Stack Overflow用户
提问于 2020-04-14 12:14:47
回答 1查看 402关注 0票数 0

我正在尝试对数据进行编码。出于示例的目的,我将使用JSON编码,尽管有其他解决方案可以解决这个问题。

我希望处理由StringInt支持的枚举,就好像它们仅仅是StringInt一样

代码语言:javascript
复制
struct UnhandledValueError: Error {}

enum Foo: String {
  case bar
}

func encode(_ data: Any?) throws -> String {
  guard let data = data else {
    return "null"
  }
  if let string = data as? String {
    return "\"\(string)\""
  }
  if let int = data as? Int {
    return String(int)
  }
  // represent String and Int based enums there

  if let array = data as? [Any?] {
    return try "[\(array.map({ try encode($0) }).joined(separator: ","))]"
  }
  if let dict = data as? [String: Any?] {
    return try "{\(dict.map({ "\"\($0.key)\": \(try encode($0.value))" }).joined(separator: ","))}"
  }

  throw UnhandledValueError()
}

let value: Any? = ["foo": Foo.bar]
try encode(value)

因为RawRepresentable是一个通用协议,所以我想我也做不到

代码语言:javascript
复制
if let value = data as? RawRepresentable

代码语言:javascript
复制
if let value = data as? RawRepresentable where RawValue == String

如何访问原始值(作为Any?)来自一个可能是RawRepresentable的对象?

EN

回答 1

Stack Overflow用户

发布于 2020-04-14 12:42:29

您可以创建一个泛型方法,并将其类型约束为其RawValue符合LosslessStringConvertible的RawRepresentable:

代码语言:javascript
复制
func encode<T>(object: T) -> String where T: RawRepresentable, T.RawValue: LosslessStringConvertible {
    .init(object.rawValue)
}

游乐场测试:

代码语言:javascript
复制
enum IntEnum: Int {
    case a = 1, b, c
}

enum StringEnum: String {
    case a, b , c
}

let int: IntEnum = .c
let string: StringEnum = .c

encode(object: int)      // "3"
encode(object: string)   // "c"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61200578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档