实例化存储在元类型Dictionary中的类

时间:2017-06-09 09:12:22

标签: ios swift dictionary reflection swift3

我已经按照Make a Swift dictionary where the key is "Type"?处的解决方案创建了可以使用类类型作为键的字典。 我想要做的是:我有一个字典应该存储类类型(也称为元类型)作为键的类型:

class MyScenario {
    static var metatype:Metatype<MyScenario> {
        return Metatype(self)
    }
}


var scenarioClasses:[Metatype<MyScenario>: MyScenario.Type] = [:]

然后我有方法来注册和执行场景:

public func registerScenario(scenarioID:MyScenario.Type) {
    if (scenarioClasses[scenarioID.metatype] == nil) {
        scenarioClasses[scenarioID.metatype] = scenarioID
    }
}

public func executeScenario(scenarioID:MyScenario.Type) {
    if let scenarioClass = scenarioClasses[scenarioID.metatype] {
        let scenario = scenarioClass()
    }
}

......问题出在最后一行:

  

构建类类型的对象&#39; MyScenario&#39;具有元型   价值必须使用&#39; required&#39;初始化程序。

由于我无法使用&#39; required&#39;在那个任务。有没有人知道如何在scenarioClass中实例化executeScenario()

1 个答案:

答案 0 :(得分:1)

这必须做好这项工作。

import Foundation

struct Metatype<T> : Hashable
{
    static func ==(lhs: Metatype, rhs: Metatype) -> Bool
    {
        return lhs.base == rhs.base
    }

    let base: T.Type

    init(_ base: T.Type)
    {
        self.base = base
    }

    var hashValue: Int
    {
        return ObjectIdentifier(base).hashValue
    }
}

public class MyScenario
{
    var p: String

    public required init()
    {
        self.p = "any"
    }

    static var metatype:Metatype<MyScenario>
    {
        return Metatype(self)
    }
}

var scenarioClasses:[Metatype<MyScenario>: MyScenario.Type] = [:]

public func registerScenario(scenarioID:MyScenario.Type)
{
    if (scenarioClasses[scenarioID.metatype] == nil)
    {
        scenarioClasses[scenarioID.metatype] = scenarioID
    }
}

public func executeScenario(scenarioID:MyScenario.Type)
{
    if let scenarioClass = scenarioClasses[scenarioID.metatype]
    {
        let scenario = scenarioClass.init()
        print("\(scenario.p)")
    }
}

// Register a new scenario
registerScenario(scenarioID: MyScenario.self)

// Execute
executeScenario(scenarioID: MyScenario.self)

// Should print "any"