Могу ли я получить имя типа, соответствующего протоколу, из этого протокола? - PullRequest
0 голосов
/ 11 января 2019

Я хотел бы знать, могу ли я найти имя типа, соответствующего данному протоколу, из этого протокола. Я думал о расширении протокола, чтобы избежать повторения в каждом типе, соответствующем этому протоколу. Я попробовал это:

protocol T {
    var type: String { get }
}

extension T {
    var type: String {
        return String(describing: T.self)
    }
}

struct S: T {}
let s = S()
print(s.type)

Но это показывает T вместо S.

Есть ли способ, которым я могу это сделать?

1 Ответ

0 голосов
/ 11 января 2019

Естественно, это печать T, это то, что вы просили с String(describing: T.self). T - это всегда сам протокол.

Внутри расширения протокола Self (заглавная 'S') - это способ обращения к соответствующему типу.

Таким образом, расширение должно быть:

extension T {
    var typeName: String {
        return String(describing: Self.self)
    }
}

Кроме того, встроенная функция type(of:) уже дает вам динамический тип любого объекта, поэтому неясно, что вам действительно нужно дублировать эту функцию самостоятельно.

...