作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有以下枚举
enum Properties: CustomStringConvertible {
case binaryOperation(BinaryOperationProperties),
brackets(BracketsProperties),
chemicalElement(ChemicalElementProperties),
differential(DifferentialProperties),
function(FunctionProperties),
number(NumberProperties),
particle(ParticleProperties),
relation(RelationProperties),
stateSymbol(StateSymbolProperties),
symbol(SymbolProperties)
}
所有的结构都是这样的
struct BinaryOperationProperties: Decodable, CustomStringConvertible {
let operation: String
var description: String { return operation }
}
那么如何使该枚举符合 CustomStringConvertible
?我尝试了一个简单的 getter,但显然它会调用自身,我想改为调用特定的结构。
奖励点:像这样定义的枚举有名称吗?
最佳答案
这样的枚举称为具有关联值的枚举。
我将通过手动切换大小写来实现description
:
extension Properties: CustomStringConvertible {
var description: String {
switch self {
case .binaryOperation(let props):
return "binaryOperation(\(props))"
case .brackets(let props):
return "brackets(\(props))"
...
}
}
}
编辑:另一种方法是使用 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
}
}
(这是一个通用解决方案,应该可用于许多类型,而不仅仅是枚举。您可能必须为具有多个子级的类型添加一些换行符。)
编辑 2:Mirror
也是 print
和 String(describing:)
用于不符合的类型自定义[调试]StringConvertible
。 You can check out the source code here .
关于swift - 如何从此枚举中获取 CustomStringConvertible 描述?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46692567/
我是一名优秀的程序员,十分优秀!