Swift 3 - 类名/类型查找

时间:2016-10-10 02:06:14

标签: swift dynamic metaprogramming metaclass

我的应用程序使用数百个绘图类的子类。 (这些子类是从艺术文件中自动生成的。)

理想情况下,我想加载一些子类的名称,检查这些子类是否实际可用,如果是,则实例化它们。

但是,纯粹的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语句来执行此操作,但之后我需要维护两组完全相同的键。呸。

因此,一种可能的解决方案是使用查找表。

问题:如果我将包含所有子类名称的字典硬编码为键,那么需要什么语法,以便检索到的值可以被实例化为所需类的对象?谢谢你的帮助。

1 个答案:

答案 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如果需要的话。