Swift,创建一个Generic UIViewController

Fre*_*red 4 generics uiviewcontroller ios swift

我正在尝试创建一个这样的类:

class MyClass<T:UIView>: UIViewController{


    override init()
    {
        super.init(nibName: nil, bundle: nil);
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func loadView() {
        self.view = T();
        println("loadView")
    }

    override func viewDidLoad() {
        super.viewDidLoad();
        println("viewDidLoad")
    }

}
Run Code Online (Sandbox Code Playgroud)

当我想像我那样使用我的课时:

self.navigationController?.pushViewController(MyClass<UIView>(), animated: true)
Run Code Online (Sandbox Code Playgroud)

方法viewDidLoad和loadView永远不会被调用!!!

你知道为什么以及是否有某种方式做我想做的事情.

提前致谢.

rin*_*aro 5

正如OP注释中所提到的,Generic类无法在Objective-C中正确表示.

解决方法是将类用作属性.这样的事情:

class MyClass: UIViewController{

    let viewCls:UIView.Type

    init(viewCls:UIView.Type = UIView.self) {
        self.viewCls = viewCls
        super.init(nibName: nil, bundle: nil);
    }

    required init(coder aDecoder: NSCoder) {
        self.viewCls = UIView.self
        super.init(coder: aDecoder)
    }

    override func loadView() {
        self.view = viewCls();
        println("loadView")
    }

    override func viewDidLoad() {
        super.viewDidLoad();
        println("viewDidLoad")
    }

}

// and then
self.navigationController?.pushViewController(MyClass(viewCls: UIView.self), animated: true)
Run Code Online (Sandbox Code Playgroud)