在swift中从Class meta类型创建实例

时间:2016-03-24 11:38:28

标签: ios swift dynamic instantiation

我有一个类,用于保存其他类的类类型。这些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,但他们也在进行类型转换。解决这个问题的任何其他方法也是可以接受的

1 个答案:

答案 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()