我的应用程序使用数百个绘图类的子类。 (这些子类是从艺术文件中自动生成的。)
理想情况下,我想加载一些子类的名称,检查这些子类是否实际可用,如果是,则实例化它们。
但是,纯粹的Swift中缺少NSClassFromString
- 样式的功能似乎意味着我必须事先向编译器声明所有的类名。
e.g。通过一个非常冗长乏味的转换声明获得课程:
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语句来执行此操作,但之后我需要维护两组完全相同的键。呸。
因此,一种可能的解决方案是使用查找表。
问题:如果我将包含所有子类名称的字典硬编码为键,那么值需要什么语法,以便检索到的值可以被实例化为所需类的对象?谢谢你的帮助。
答案 0 :(得分:1)
protocol P {
init()
}
extension String : P { }
extension Int : P { }
let types : [String : P.Type] = [
"str": String.self,
"int": Int.self
]
if let type = types["int"] {
let object = type.init()
assert(object is Int)
}
现在,您可以使用所有标准字典操作来检查是否存在任何内容,根据需要转换您提取的类型等。
我在上面的例子中定义了协议,以便拥有一个通用的初始化器(这可能是大多数情况下你可能需要的),但是你可以简单地使用Any.Type
并使用{{1如果需要的话。