1、编译器提示出错:
'required' initializer 'init(coder:)' must be provided by subclass of 'UIViewController'
2、原因分析
1,在 Swift 中,类的初始化器有两种,分别是Designated Initializer(指定初始化器)和Convenience Initializer(便利初始化器)
2,如果子类没有定义任何的指定初始化器,那么会默认继承所有来自父类的指定初始化器。
3,如果子类提供了所有父类指定初始化器的实现,那么自动继承父类的便利初始化器
4,如果子类只实现部分父类初始化器,那么父类其他的指定初始化器和便利初始化器都不会继承。
5,子类的指定初始化器必须要调用父类合适的指定初始化器。
3、错误分析
A、第一个错误因为init(coder aDecoder: NSCoder) 方法是来自父类的指定构造器,因为这个构造器是 required,必须要实现. 但是因为我们已经重载了 init(),定义了一个指定构造器,所以这个方法不会被继承,要手动覆写。
B、第二个错是因为指定构造器必须调用它最近父类的指定构造器。
4、示例
报错源码:
/* 实现切换的画面 */ import UIKit class ColorViewController:UIViewController { var number:Int!; let colorMap = [ 1:UIColor.greenColor(),2:UIColor.blueColor(),3:UIColor.purpleColor() ]; /// 初始化函数 ========!!!!! 这个函数要报错 init(initNumber:Int) { self.number = initNumber; super.init(nibName: nil,bundle: nil); } override func viewDidLoad() { ///super.viewDidLoad(); /// 实例化label对象 let numberLabel = UILabel(frame: CGRectMake(0,30,20)); numberLabel.center = self.view.center; /// 设置显示内容 numberLabel.text = "第\(number)页"; ///文字自动调整显示宽度 numberLabel.adjustsFontSizeToFitWidth = true; /// 设置背景色 numberLabel.backgroundColor = UIColor.whiteColor(); self.view.addSubview(numberLabel); self.view.backgroundColor = colorMap[number]; } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }修改后源码 :
/* 实现切换的画面 */ import UIKit class ColorViewController:UIViewController { var number:Int!; let colorMap = [ 1:UIColor.greenColor(),3:UIColor.purpleColor() ]; /// 初始化函数 init(initNumber:Int) { self.number = initNumber; super.init(nibName: nil,bundle: nil); } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented"); } override func viewDidLoad() { ///super.viewDidLoad(); /// 实例化label对象 let numberLabel = UILabel(frame: CGRectMake(0,20)); numberLabel.center = self.view.center; /// 设置显示内容 numberLabel.text = "第\(number)页"; ///文字自动调整显示宽度 numberLabel.adjustsFontSizeToFitWidth = true; /// 设置背景色 numberLabel.backgroundColor = UIColor.whiteColor(); self.view.addSubview(numberLabel); self.view.backgroundColor = colorMap[number]; } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }