Comment convertir AnyClass en une classe spécifique et l’initialiser dynamicment dans Swift?

Dans Object-C, je stocke des objects de classe dans un tableau et les lance dynamicment comme ceci:

self.controllers=@[[OneViewController class],[TwoViewController class]]; Class clz = self.controllers[index]; UIViewController *detailViewController = [[clz alloc] init]; 

En Swift, j’essaie de cette façon, mais cela soulève une erreur:

 var controllers:AnyClass[] = [OneViewController.self,TwoViewController.self] var clz : AnyClass = controllers[index] var instance = clz() // Error:'AnyObject' is not constructible with () 

Je me demande s’il existe un moyen de convertir AnyClass en une classe spécifique? Ou d’autres bonnes idées?

Vous pouvez spécifier le tableau à utiliser comme type de superclasse, puis la déduction de type est la bonne chose (syntaxe Beta-3):

 let classArray: [UIViewController.Type] = [ OneViewController.self, TwoViewController.self ] let controllerClass = classArray[index] let controller = controllerClass.init() 

J’ai trouvé un moyen de résoudre ce problème:

 var controllers:AnyClass[] = [OneViewController.self,TwoViewController.self] var clz: NSObject.Type = controllers[0] as NSObject.Type var con = clz() 

n’oubliez pas d’append @objc dans la classe de ViewController

Une variable AnyClass doit d’abord être convertie en un type spécifique pour initialiser une instance:

 // Code checked to run on xCode 7.1.1 import UIKit var aClass: AnyClass = UIButton.self // Error: 'init' is a member of the type... // let doesNotWork = aClass.init() // aClass must be casted first var buttonClass = aClass as! UIButton.Type var oneButton = buttonClass!.init() var otherButton = buttonClass!.init(frame: CGRectZero) 

Voici une implémentation pure et rapide des types de classes dynamics. Les classes doivent étendre le même protocole.

 protocol X{var s:Ssortingng{get};init(_ s:Ssortingng)} class A:X{var s:Ssortingng;required init(_ s:Ssortingng){self.s = s}} class B:X{var s:Ssortingng;required init(_ s:Ssortingng){self.s = s}} var instance:X var classType:X.Type classType = A.self instance = classType.init("abc") print(instance.s)//abc classType = B.self instance = classType.init("123") print(instance.s)//123 

Si les classes sont toutes des sous-classes Objective-C NSObject , vous pouvez faire quelque chose comme ça (oui, les backticks sont intentionnels):

 var constructors: (Void -> NSObject!)[] = [ NSMutableSsortingng.`new`, NSMutableArray.`new`, NSMutableDictionary.`new` ] let ssortingng = constructors[0]() (ssortingng as NSMutableSsortingng).appendSsortingng("Hello") let array = constructors[1]() (array as NSMutableArray).addObject("Swift") let dictionary = constructors[2]() (dictionary as NSMutableDictionary).setObject("Objective-C", forKey: "Goodbye") NSLog("dynamically created a ssortingng: \(ssortingng), an array: \(array), and a dictionary: \(dictionary)") 

Il devrait sortir:

 dynamically created a ssortingng: Hello, an array: ( Swift ), and a dictionary: { Goodbye = "Objective-C"; } 

Il me semble qu’il devrait y avoir une façon plus élégante de le faire.