【发布时间】:2017-02-18 09:51:49
【问题描述】:
我的应用程序使用了数百个绘图类的子类。 (这些子类是从艺术文件中自动生成的。)
理想情况下,我想加载一些子类的名称,检查这些子类是否实际可用,如果是,则实例化它们。
然而,似乎纯 Swift 中缺少 NSClassFromString 风格的功能意味着我不得不提前向编译器声明我的所有类名。
例如通过非常冗长乏味的 switch 语句获取课程:
func drawingObjectFromClassName(_ className: String) -> SomeDrawingProtocol?
{
switch className {
case "foo": return foo()
case "bar": return bar()
// etc.
default:
print("Warning: no class found for className: ", className)
return nil
}
}
但我还想检查是否存在子类(例如“foo”),而不必实例化对象。
我可以复制该 switch 语句来执行此操作,但是我需要维护两组相同的键。呸。
因此,一种可能的解决方案是使用查找表。
问题:如果我用我的所有子类名称作为键对字典进行硬编码,values 需要什么语法,以便检索到的值可以被实例化为所需类的对象?感谢您的帮助。
【问题讨论】:
-
您可以返回
foo.self来获取一个类对象(SomeDrawingProtocol.Type类型)。
标签: swift dynamic metaprogramming metaclass