CustomStringConvertible使枚举崩溃?

时间:2019-05-13 14:02:32

标签: swift

我在CustomStringConvertibleenum一起在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)")

奇怪的是,现在我遇到了分割错误。即使我是新手,我也发现这个问题很有趣,而且我从未见过协议一致性声明会导致此问题。

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

字符串插值(如"\(self)")为符合description协议的类型的值调用CustomStringConvertible属性。

这意味着您对var description的实现会递归地调用自身,这最终会导致堆栈溢出并终止程序。