swift初始化函数失败

/ Mac / 没有评论 / 1468浏览

swift初始化函数失败

1、编译器提示出错:

'required' initializer 'init(coder:)' must be provided by subclass of 'UIViewController'

2、原因分析

  1. 在 Swift 中, 类的初始化器有两种, 分别是Designated Initializer(指定初始化器)和Convenience Initializer(便利初始化器)
  2. 如果子类没有定义任何的指定初始化器, 那么会默认继承所有来自父类的指定初始化器。
  3. 如果子类提供了所有父类指定初始化器的实现, 那么自动继承父类的便利初始化器
  4. 如果子类只实现部分父类初始化器,那么父类其他的指定初始化器和便利初始化器都不会继承。
  5. 子类的指定初始化器必须要调用父类合适的指定初始化器。

3、错误分析

  1. 第一个错误因为init(coder aDecoder: NSCoder) 方法是来自父类的指定构造器, 因为这个构造器是 required, 必须要实现. 但是因为我们已经重载了 init(), 定义了一个指定构造器, 所以这个方法不会被继承, 要手动覆写。
  2. 第二个错是因为指定构造器必须调用它最近父类的指定构造器。

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, 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(),
    2:UIColor.blueColor(),
    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, 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()
  }
}