2017-10-20 22 views
0

Je tableau de chaînesinstancier ViewController et de le jeter à la classe de chaîne dans Swift

var arr = ["firstViewController", "secondViewController", ....] 

Pour chacun, il est des éléments que je dois instancier ViewController comme

var myVC = self.storyboard?.instantiateViewController(withIdentifier: "firstViewController") as! firstViewController 

Si je veux instancier Voir Contrôleurs de la boucle j'ai besoin de faire classe à partir de la chaîne, mais ce code

let namespace = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String 
let cls: AnyClass = NSClassFromString("\(namespace).\(className)")! 

Ne fonctionne pas

+0

Avez-vous essayé [cette] solution (https://stackoverflow.com/a/32265287/308315) posté sur une question StackOverflow semblable? – erikmartens

+1

_Pourquoi as-tu besoin de ça? Vous pourriez juste instancier les contrôleurs dans une boucle comme 'UIViewController's et ensuite essayer de downcast quand nécessaire ... – Alladinian

Répondre

1

Dans Swift, vous ne pouvez pas convertir un objet de type Runtime. Swift connaît les types de toutes ses variables à la compilation.

Maintenant vous avez une variable, dont la valeur est un type dont le compilateur ne sait rien, donc le compilateur ne peut pas vous laisser faire quoi que ce soit avec une variable pour le type cast.

Référence: - Link1, Link2

1

Pas besoin d'utiliser NSClassFromString(_:) pour instancier un UIViewController d'une boucle. Vous étiez dirigé dans la bonne direction dans vos deux premières lignes de code:

let nameArray = ["firstViewController", "secondViewController" /*....*/] 
var controllerArray = [UIViewController?]() 

for name in nameArray { 
    controllerArray.append(self.storyboard?.instantiateViewController(withIdentifier: name)) 
}