我需要在swift中从可加载包中创建一个主类的实例。我所知道的类是它符合特定协议(非@objc协议),它不是NSObject的子类。这有可能吗?
在Obj-C中使用NSObject非常简单,因为实际上,obj-c并不关心类型,但是这个快速的人,NSBundle的principalClass属性返回AnyClass?,它怎么可能在地球创建AnyClass的实例?输入并告诉它现在它符合swift协议?提前致谢
答案 0 :(得分:2)
非@objc
协议不携带运行时类型信息:这意味着如果在编译时未知关系,则不能使用as
运算符将类类型转换为协议类型时间。另一方面,@objc
协议确实携带运行时类型信息。
如果你的协议被标记为@objc
并且至少宣布了一个初始化程序,那么你应该可以这样做:
if let bundle = NSBundle(...) {
if let meta = bundle.principalClass as? MyProtocol.Type {
let obj: MyProtocol = meta(initParam: a, initParam2: b, ...)
}
}
...如果您尝试将AnyType
转换为类似的协议类型,则当前Swift编译器将crash。但是,如果你可以使用类类型而不是协议类型,它就可以工作。