我正在尝试对数据进行编码。出于示例的目的,我将使用JSON编码,尽管有其他解决方案可以解决这个问题。
我希望处理由String或Int支持的枚举,就好像它们仅仅是String和Int一样
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是一个通用协议,所以我想我也做不到
if let value = data as? RawRepresentable或
if let value = data as? RawRepresentable where RawValue == String如何访问原始值(作为Any?)来自一个可能是RawRepresentable的对象?
发布于 2020-04-14 12:42:29
您可以创建一个泛型方法,并将其类型约束为其RawValue符合LosslessStringConvertible的RawRepresentable:
func encode<T>(object: T) -> String where T: RawRepresentable, T.RawValue: LosslessStringConvertible {
.init(object.rawValue)
}游乐场测试:
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"https://stackoverflow.com/questions/61200578
复制相似问题