Мне нужно определить динамический тип моего объекта в методе, который реализован в суперклассе. Суперкласс называется BaseClient, и DisplayClient наследуется от него.
Мне нужно только имя класса, а не имя пакета. Вот что я пробовал:
print("1", String(describing: type(of: self))) // DisplayClient
print("2", type(of: self)) // DisplayClient
print("3", type(of: self).description()) // package.DisplayClient
print("4", "\(type(of: self))") // DisplayClient
Почему
type(of: self).description()
return package.DisplayClient, в то время как другие возвращают только имя класса? Интересно, что вызывается внутри, когда я использую String(описание: type(of: self)). Я бы предположил, что это делает именно то, что делаю я (вызов description()).
Где я могу найти дополнительную информацию о том, как строки генерируются внутри?
В документах говорится:
Используйте этот инициализатор для преобразования экземпляра любого типа в предпочтительное представление в виде экземпляра String. Инициализатор создает строковое представление экземпляра одним из следующих способов, в зависимости от его соответствия протоколу:
- Если экземпляр соответствует протоколу TextOutputStreamable, результат получается путем вызова instance.write(to: s) для пустой строки s.
- Если экземпляр соответствует протоколу CustomStringConvertible, результатом будет instance.description.
- Если instance соответствует протоколу CustomDebugStringConvertible, результатом будет instance.debugDescription.
- Неопределенный результат автоматически предоставляется стандартной библиотекой Swift.
Но type(of: self) даже не имеет атрибута описания. У него есть только метод description(). Это какой-то особый случай, который обрабатывается компилятором по-разному?