我试图从String中读取一个类并将其类型传递给泛型函数。但似乎没有办法实现这一目标:
protocol Person { ... }
class Student: Person { ... }
class Teacher: Person { ... }
func foo<SomePerson: Person>(param: String, type: SomePerson.Type) { ... }
// Get class from string and pass class type to foo()
let someClass = NSClassFromString("MyApp.Teacher")
foo("someParam", type: someClass.dynamicType)
尝试这个我收到错误:
Cannot invoke 'foo' with an argument list of type '(String, type: AnyClass.Type)
实际上是否有可能获得真实的&#39;键入&#39;老师&#39;而不是通用类型&#39; AnyClass&#39;并将其传递给foo()?这些类是在运行时从文件中读取的 - 因此在调用foo()时使用硬类名称是不可能的。
感谢您的任何建议!
答案 0 :(得分:3)
如果Person
是一个类,原始问题已写入:
因为你需要为编译器的生活变得更加困难,所以你需要帮助他一点。在调用函数之前,您必须确保类型是正确的:
if let actualType = someClass as? Person.Type {
foo("someParam", type: actualType)
} else {
// error handling here
}
产生所需的工作代码:
如果Person
是协议:
你将度过糟糕的一天。上述解决方案无效。据我所知,你唯一的选择是检查每个可能的子类:
if let actualType = someClass as? Student.Type {
foo("someParam", type: actualType)
} else if let actualType = someClass as? Teacher.Type {
foo("someParam", type: actualType)
}
// etc.