如何从该枚举中获取CustomStringConvertible描述?

Mor*_*eu5 5 enums swift

我有以下枚举

enum Properties: CustomStringConvertible {
    case binaryOperation(BinaryOperationProperties),
    brackets(BracketsProperties),
    chemicalElement(ChemicalElementProperties),
    differential(DifferentialProperties),
    function(FunctionProperties),
    number(NumberProperties),
    particle(ParticleProperties),
    relation(RelationProperties),
    stateSymbol(StateSymbolProperties),
    symbol(SymbolProperties)
}
Run Code Online (Sandbox Code Playgroud)

和所有的结构看起来像这样

struct BinaryOperationProperties: Decodable, CustomStringConvertible {
    let operation: String
    var description: String { return operation }
}
Run Code Online (Sandbox Code Playgroud)

那么如何使该枚举符合CustomStringConvertible?我尝试了一个简单的吸气剂,但显然它会调用自身,而我想改为调用特定的结构。

优点:这样定义的枚举是否有名称?

Ole*_*ann 5

这样的枚举称为带有关联值的枚举

我可以description通过手动切换案例来实现:

extension Properties: CustomStringConvertible {
    var description: String {
        switch self {
        case .binaryOperation(let props):
            return "binaryOperation(\(props))"
        case .brackets(let props):
            return "brackets(\(props))"
        ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:一种替代方法是使用Swift的Mirror反射API。实例的枚举实例被列为镜像的子实例,您可以像下面那样打印其标签和值:

extension Properties: CustomStringConvertible {
    var description: String {
        let mirror = Mirror(reflecting: self)
        var result = ""
        for child in mirror.children {
            if let label = child.label {
                result += "\(label): \(child.value)"
            } else {
                result += "\(child.value)"
            }
        }
        return result
    }
}
Run Code Online (Sandbox Code Playgroud)

(这是一个通用解决方案,应该适用于许多类型,而不仅仅是枚举。您可能必须为具有多个子代的类型添加一些换行符。)


编辑2:Mirror也是不符合的类型,printString(describing:)用于不符合的类型Custom[Debug]StringConvertible您可以在此处查看源代码