在Objective-C中,我过去常常覆盖init
的{{1}}方法。我无法在Swift中实现同样的目标:
Objective-C代码:
UIViewController
如果我尝试在Swift中这样做,我会收到错误#34;无法分配给自己"。我已经实现了- (instancetype)init
{
self = [super init];
if (self) {
self = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"ViewController"];
}
return self;
}
方法,只是为了解决一些错误。
有人可以告诉我如何将上述Objective-C代码移植到Swift以获得所需的行为。
我想从故事板中初始化ViewController。
答案 0 :(得分:2)
您无法在self
中分配init
。您应该使用class
方法或公共函数。
class func viewControllerFromStoryboard() -> ViewController? {
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle(forClass: ViewController.self))
if let controller = storyboard.instantiateViewControllerWithIdentifier("ViewController") as? ViewController
{
return controller
}
return nil
}
您可以致电
let controller = ViewController.viewControllerFromStoryboard()
答案 1 :(得分:0)
swift中的init方法与objc中的方法不同。
在objc the only requirement for init method is that the initializing method begins with the letters “init”
中。您在此方法中创建一个实例并分配给指针self
而在swift Initializing is the process of preparing an instance of a class, structure, or enumeration for use
。它有点像你已经有一个self
点的实例。你在init方法中做的是设置自己的属性和其他
这就是为什么你不能迅速为班级分配自我
但您可以在struct
的变异方法中指定给self答案 2 :(得分:0)
我建议你这样写
class func customInit -> XXXController {
var vc: XXXController = XXXController()
// write something that you want to initialize
return vc
}
就像你写objc
一样- (instancetype)initCustom {
self = [super init];
if (self) {
// write something that you want to initialize
}
return self;
}
你可以单元格
var customVc: XXXController = XXXController.customInit()
就像
一样 XXXController *vc = [[XXXController alloc] initCustom]