我有一个类,用于保存其他类的类类型。这些classtypes在运行时注册,所以实际上我不会在编译时知道Class类型。但后来我将使用这些注册的类类型来创建它们的实例。这是我的班级定义
class registeredClassTypes
{
var URLContext: AnyClass
var ParserContext: AnyClass
var ValidationContext: AnyClass
func setTypes(URLContext: AnyClass, ParserContext: AnyClass, ValidationContext: AnyClass ) {
self.URLContext=URLContext
self.ParserContext = ParserContext
self.ValidationContext = ValidationContext
}
}
现在,我已经收集了包含这些类型的此类对象。
let classTypesObj = registeredClassTypes()
classTypesObj.setTypes(SomeClass.self, ParserContext: AnotherClass.self, ValidationContext: OneMoreClass.self)
有时我需要这些类型的实例。虽然可能如下所示,但使用类型转换类:
let requestType:SomeClass.Type = classTypesObj.URLContext as! SomeClass.Type
let obj = requestType.init() //successfully creates the object of 'SomeClass'
我已经引用了一些博客,并且开始知道没有类型转换就无法创建元类型的对象。
但我的问题是我不会在课堂上知道“SomeClass'所以我不能把它强加给SomeClass'。 有没有办法实现这个动态解析类类型。我想要这样或其他任何方式:
let requestType = classTypesObj.URLContext
let obj = requestType.init()
提到this blog& this blog也是xolox/vim-session,但他们也在进行类型转换。解决这个问题的任何其他方法也是可以接受的
答案 0 :(得分:1)
这种活力是Objective C的标志,在Swift中更是如此。 Swift更喜欢静态类型,所有属性和方法都应该在编译时知道。如果你想保留当前的方法,你可以在ObjectiveC中编写动态部分,然后根据需要在Swift中进行扩展。
如果您想在纯Swift中执行此操作,请考虑协议:
protocol URLContextProtocol {
init()
func method1 ()
func method2 ()
}
protocol ParserContextProtocol {
init()
func method3 ()
func method4 ()
}
protocol ValidationContextProtocol {
init()
func method5 ()
func method6 ()
}
func setTypes(URLContext: URLContextProtocol, ParserContext: ParserContextProtocol, ValidationContext: ValidationContextProtocol) {
// ...
}
用法:
class URLContext1: URLContextProtocol { ... }
class URLContext2: URLContextProtocol { ... }
let classTypesObj = RegisteredClassTypes()
classTypesObj.setTypes(URLContext: URLContext1, ...)
// Init an instance
let obj = classTypeObj.URLContext()