在 swift 中动态加载 class 的实例

Loading a instance of a class dynamically in swift

我想初始化一个在运行时指定的 class 的实例。我有以下设置。

//MyClass1 & MyClass2 inherit from UIViewController
let arr = MyClass1.self,MyClass2.self] 

func didSelectRow(index:Int) {
    var controllerRef = arr[index] //This returns a .Type
    var controllerClass = controllerRef() //This returns “the class” MyClass1
    //This is where I'm stuck. How do I initialize controller??

    //Finally, push VC
    self.navigationController?.pushViewController(controller, animated: true)
}

要用 Objective C 初始化 VC,我可以这样做:

UIViewController *controller = [((UIViewController *)[controllerClass alloc]) initWithNibName:class1Nib bundle:nil];

对于 Swift,我期待类似下面的语法,但它不起作用

//Doesn’t work
var controller = (controllerClass as UIViewController)(nibName: class1Nib, bundle:nil) 

//Overriding the init method in MyClass1 and then calling the below doesn’t work
var controller = controllerClass(nibName: class1Nib, bundle:nil)

//The below works, but viewDidLoad() does not get called. It only loads the nib file

var controller = UIViewController(nibName: Class1Nib, bundle:nil)

感谢任何帮助。谢谢

你的问题,重复和毫无意义 "doesn't work" 和 "the below",令人困惑和困惑,所以我会假设你想要做的是实例化并推送给定的视图控制器它 class,我将用几行代码简单地证明这是可能的。

这是一个 returns UIViewController subclass:

的函数
func provideVCClass() -> UIViewController.Type {
    return ViewController.self
}

下面是按钮的操作处理程序中的几行,我们在其中调用该函数并使用 class 实例化该视图控制器并将其推送到当前导航控制器:

let vcclass = provideVCClass()
let vc = vcclass(nibName: "View", bundle: nil)
self.navigationController?.pushViewController(vc, animated: true)

我向你保证这个确实工作:正确的视图控制器子class实例化,它的笔尖加载,其视图确实出现在界面中。

所以我只能回答你的问题,但我并不完全理解,那就是 Go Ye And Do Likely。

编辑 这是一个小后记。如果您的代码实际上是:

let arr = [MyClass1.self, MyClass2.self]

我建议你试着说

let arr : [UIViewController] = [MyClass1.self, MyClass2.self]

...以防万一 Swift 未在此处推断出正确的类型。