我有protocol P
,class A and B
,我的目标是使用从字符串创建的类类型参数调用泛型方法a<T: P>(_: T.Type)
。
protocol P: class {
static var p: String { get }
}
extension P {
static var p: String { return String(describing: self) }
}
class A: P {
func a<T: P>(_: T.Type) {
print(T.p)
}
}
class B: P {}
下面的代码有效,因为强制转换为B.Type修复了类类型
let b = "B"
let type = NSClassFromString(b) as! B.Type
A().a(type)
但是如果我们说我们有一个类名数组而不知道它们的具体类型,我们怎么能通过它们呢?
["ClassA", "ClassB", "ClassC"].forEach({ className in
let type = NSClassFromString(className) as! ????
A().a(type)
})
答案 0 :(得分:1)
在Swift中,泛型声明中的类型参数需要在编译时解决。
因此,您的????
必须是符合P
的具体类型。但是您不能使用您描述的任何具体类型A.Type
或B.Type
。
您可能会知道您无法使用P.Type
,因为协议P
在Swift中并不符合P
本身。
如何将方法a(_:)
声明为非泛型的?
class A: P {
func a(_ type: P.Type) {
print(type.p)
}
}
["ModuleName.A", "ModuleName.B"].forEach({ className in
let type = NSClassFromString(className) as! P.Type
A().a(type)
})
您可以将类型P.Type
的类对象传递给类型P.Type
的参数。