Получить «путь» вложенных типов в виде строки в Swift - PullRequest
0 голосов
/ 03 июля 2018

Проблема

Я ищу общий способ получения полного имени вложенного типа в 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:) меня немного беспокоит, потому что

  • никто не может гарантировать, что в некоторых случаях он не возвращает какой-либо другой префикс или вообще не префикс
  • в описании функции указано, что она предназначена только для целей отладки.

Так есть ли способ получить (полное) имя вложенного типа безопасным способом?

...