我有以下枚举
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?我尝试了一个简单的吸气剂,但显然它会调用自身,而我想改为调用特定的结构。
优点:这样定义的枚举是否有名称?
这样的枚举称为带有关联值的枚举。
我可以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也是不符合的类型,print并String(describing:)用于不符合的类型Custom[Debug]StringConvertible。您可以在此处查看源代码。