从字符串中检索的类类型

时间:2016-02-14 18:14:09

标签: swift generics casting swift2

我试图从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()时使用硬类名称是不可能的。

感谢您的任何建议!

1 个答案:

答案 0 :(得分:3)

如果Person是一个类,原始问题已写入:

因为你需要为编译器的生活变得更加困难,所以你需要帮助他一点。在调用函数之前,您必须确保类型是正确的:

if let actualType = someClass as? Person.Type {
    foo("someParam", type: actualType)
} else {
    // error handling here
}

产生所需的工作代码:

enter image description 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.