我有一个通用函数,如:
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() }
它有效,但我不必指定,因为它应该被推断。
答案 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)
,具体取决于您的意图。