Проблема
Я ищу общий способ получения полного имени вложенного типа в Swift, т. Е. Когда я определяю вложенные структуры следующим образом:
struct A {
struct B {
struct C {
}
}
}
и я создаю экземпляр C
, затем я хочу иметь метод, который возвращает полный путь к типу этого экземпляра:
let c = A.B.C()
fullTypeName(c) // should return "A.B.C"
Мои подходы
Когда я использую
String(describing: type(of: c))
возвращает только последний компонент C
, то есть имя типа относительно области, в которой он определен.
Когда я использую
String(reflecting: type(of: c))
фактически возвращает весь путь, но с каким-то уродливым префиксом __lldb_expr_22.A.B.C
.
Я создал простой пользовательский String
инициализатор из этого:
extension String {
init<Subject>(describingNestedType: Subject) {
let string = String(reflecting: Subject.self)
let components = string.split(separator: ".")
let path = components.dropFirst().joined(separator: ".")
self = path
}
}
, который работает очень хорошо:
let c = A.B.C()
let cString = String(describingNestedType: c)
print(cString) // prints "A.B.C"
но использование метода String(reflecting:)
меня немного беспокоит, потому что
- никто не может гарантировать, что в некоторых случаях он не возвращает какой-либо другой префикс или вообще не префикс
- в описании функции указано, что она предназначена только для целей отладки.
Так есть ли способ получить (полное) имя вложенного типа безопасным способом?