实例化存储在metatype字典中的类
我已经按照制作一个Swift字典的关键是“types”的解决scheme? 创build可以使用类types作为键的字典。 我想要做的是:我有一个字典,应该存储类types与他们的类types(又名元types)作为键:
class MyScenario { static var metatype:Metatype<MyScenario> { return Metatype(self) } } var scenarioClasses:[Metatype<MyScenario>: MyScenario.Type] = [:]
然后我有方法来注册和执行scheme:
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() } }
问题是在最后一行:
使用元types值构造类types为“MyScenario”的对象必须使用“必需的”初始值设定项。
看起来编译器很困惑,因为我不能在这个任务中使用'required'。 有没有人有一个想法,我将不得不在executeScenario()
实例化scenarioClass
?
这必须完成这项工作。
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"