我想问一下Swift中的类型转换。
有两个班级。
RootViewController
MyViewController
,类层次结构如下所示:
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中采用更好的方法吗?
任何帮助将不胜感激!
答案 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)
好的,您可以通过以下三种方式进行实例化:
快速推断Type
:
let myVC = RootViewController.instance() //Swift will automatically infer the type
明确告诉Type
:
let myVC: RootViewController = RootViewController.instance()
投射到Type
:
let myVC = RootViewController.instance() as! RootViewController
所有这三个都是有效的。