CustomStringConvertible вылетает enum? - PullRequest
0 голосов
/ 13 мая 2019

Я играл с 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)")

Странно, но теперь я получаю ошибку сегментации.Несмотря на то, что я новичок в swift, я нахожу эту проблему забавной, и я никогда не видел, чтобы объявление соответствия протокола могло вызвать эту проблему.

Есть идеи, почему это происходит?

1 Ответ

1 голос
/ 13 мая 2019

Строковая интерполяция (как в "\(self)") вызывает свойство description для значений типов, которые соответствуют протоколу CustomStringConvertible.

Это означает, что ваша реализация var description вызывает себя рекурсивно,что в конечном итоге приводит к переполнению стека и завершению программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...