我在CustomStringConvertible
和enum
一起在XCode游乐场玩耍,遇到了一个非常奇怪的问题。
请参阅以下enum
:
enum A {
case v(UInt8)
init(val: UInt8) {
self = .v(val)
}
}
var a = A(val: 5)
print("\(a)")
此代码可以正常工作,并且a
等于.v(5)
。
此后,我试图使此类符合CustomStringConvertible
。因此,我实现了description
计算出的属性:
enum A {
case v(UInt8)
init(val: UInt8) {
self = .v(val)
}
var description: String {
return "\(self)"
}
}
var a = A(val: 5)
print("\(a) \(a.description)")
,但一切仍然按预期进行。然后我只是在声明中添加了协议一致性:
enum A: CustomStringConvertible {
case v(UInt8)
init(val: UInt8) {
self = .v(val)
}
var description: String {
return "\(self)"
}
}
var a = A(val: 5)
print("\(a) \(a.description)")
奇怪的是,现在我遇到了分割错误。即使我是新手,我也发现这个问题很有趣,而且我从未见过协议一致性声明会导致此问题。
知道为什么会这样吗?
答案 0 :(得分:1)
字符串插值(如"\(self)"
)为符合description
协议的类型的值调用CustomStringConvertible
属性。
这意味着您对var description
的实现会递归地调用自身,这最终会导致堆栈溢出并终止程序。