从父类

时间:2017-06-19 09:41:45

标签: ios swift

我想问一下Swift中的类型转换。

有两个班级。

  1. RootViewController
  2. MyViewController
  3. ,类层次结构如下所示:

    class RootViewController: UIViewController {
    
    }
    
    class MyViewController: RootViewController {
    
    }
    

    并且,我想简单地调用instance函数来从xib文件创建一个实例。 所以我在RootViewController中实现了以下功能。

    目标-C

    + (instancetype)instance {
        return [[[self class] alloc] initWithNibName:NSStringFromClass([self class]) bundle:nil];
    }
    

    夫特

    public class func instance<T:RootViewController>() -> T {
        let type = self as UIViewController.Type
        let name = NSStringFromClass(type).components(separatedBy: ".").last!
        let instance = type.init(nibName: name, bundle: nil)
        return instance as! T
    }
    

    ,用法如下。

    目标-C

    MyViewController *vc = [MyViewController instance];
    

    夫特

    let vc = MyViewController.instance() as! MyViewController
    

    问题:

    我是否必须始终在Swift中使用as! MyViewController强制转换实例类型? 或者有人可以建议我在Swift中采用更好的方法吗?

    任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:3)

你也可以这样使用

let vc:MyViewController = MyViewController.instance()

答案 1 :(得分:2)

class RootViewController: UIViewController {
    public class func instance() -> Self {
        func inner<T: RootViewController>(type: T.Type) -> T {
            let name = NSStringFromClass(type).components(separatedBy: ".").last!
            let type1 = type as UIViewController.Type
            let instance = type1.init(nibName: name, bundle: nil)
            return instance as! T
        }
        return inner(type: self)
    }
}

我建议创建一个扩展方法:

extension UIViewController {
    public class func instance() -> Self {
        func inner<T: UIViewController>(type: T.Type) -> T {
            let name = NSStringFromClass(type).components(separatedBy: ".").last!
            return T(nibName: name, bundle: nil)
        }
        return inner(type: self)
    }
}

答案 2 :(得分:0)

好的,您可以通过以下三种方式进行实例化:

  1. 快速推断Type

    let myVC = RootViewController.instance()   //Swift will automatically infer the type
    
  2. 明确告诉Type

    let myVC: RootViewController = RootViewController.instance()
    
  3. 投射到Type

    let myVC = RootViewController.instance() as! RootViewController
    
  4. 所有这三个都是有效的。