获取泛型类型的名称,其中generic必须扩展另一种类型

时间:2016-09-03 14:10:51

标签: swift generics

我有一个通用函数,如:

func register<T: Component>(factory: () -> T) {
    // name is always Component, I'd like it to be
    // the concrete implementation
    let name = "\(T.self)"
}

我希望得到我传入的课程的名称,例如:

使用此协议:

protocol Component { }

这节课:

class Something : Component { }

我希望register了解Something而不是Component

register() { Something() } // "name" should be "Something"

但是,我总是得到Component。那么,在register函数中,我如何获得T

的具体实现的名称

如果我register看起来像:

func register<T: component>(_: T.Type, factory: () -> T)

然后称之为:

register(Something.self) { Something() }

它有效,但我不必指定,因为它应该被推断。

1 个答案:

答案 0 :(得分:0)

如果您对输入有特定的想法,可以执行if let语句或切换。

    if let comp = T as? String {
        //you now have a constant called comp that is a string
    }else if let comp = T as? Int {
        //comp is Int, if comp is an int, you still have T if you want to use it
    }//and continue for however long you want

我不确定你为什么要在String中拥有该类的名称,但你似乎已经这样做了?

在目标C中,您可以执行T.class,其他有用的功能可以是T.superClass()T.isSubclass(of: String),具体取决于您的意图。