Instanciation de classs stockées dans le métatype Dictionnaire

J'ai suivi la solution à Make a Swift dictionary où la key est "Type"? pour créer des dictionarys pouvant utiliser un type de class en tant que keys. Ce que je veux faire est: J'ai un dictionary qui devrait stocker les types de class avec leur type de class (aka metatype) comme keys, aussi:

class MyScenario { static var metatype:Metatype<MyScenario> { return Metatype(self) } } var scenarioClasses:[Metatype<MyScenario>: MyScenario.Type] = [:] 

Ensuite, j'ai des methods pour save et exécuter des scénarios:

 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() } } 

… Le problème est dans la dernière ligne:

La construction d'un object de type class 'MyScenario' avec une valeur de métatype doit utiliser un initialiseur 'required'.

Il semble que le compilateur soit confus à ce moment-là puisque je ne peux pas utiliser 'required' pour cette affectation. Est-ce que quelqu'un a une idée de comment je devrais instancier le scenarioClass dans executeScenario() ?

Cela doit faire le travail.

 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: Ssortingng 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"