在从初始化程序返回之前,不会在所有路径上调用super init

时间:2016-12-06 14:05:35

标签: ios swift

我制作了一个包装Alamofire的框架。

在我的框架中进行测试时(在测试目标中)我有这个代码可以工作。

import Foundation
@testable import NetworkManager

class MockRouter: Router {


enum APICalls {
    case func1
    case func2
}

var calls: APICalls!

init(calls: APICalls) {
    self.calls = calls
}

}

当我将其作为框架添加到不同的项目时

import Foundation
import NetworkManager

class JokesRouter: Router {

enum APICalls {
    case func1
    case func2
}

var calls: APICalls!

init(calls: APICalls) {
    self.calls = calls
}


}

我收到错误:

  

在从初始化程序

返回之前,不会在所有路径上调用super init

所以我添加了Super.init()

init(calls: APICalls) {
    super.init()
    self.calls = calls
}

现在我收到了这个错误:

  

super.init不能在初始化程序之外调用

知道这是什么问题吗?

2 个答案:

答案 0 :(得分:4)

您需要在public init() {}中声明空Router

虽然这是一个神秘的错误,但问题是子类无法调用super.init(),因为除非您将NetworkManager模块声明为public,否则无法在init()模块之外访问该初始化程序。 <{1}}中自动生成的Router默认情况下不是public

它在您的测试类中有效,因为@testable import回避了默认的internal访问限制。

答案 1 :(得分:0)

我试图创建Swift编程的继承功能。

我创建了ViewController作为超类。 然后我创建了另一个类作为超类ViewControllerA

ViewController的子类名

ViewController类:

import UIKit

class ViewController: UIViewController {

  //: public variables
  var area:               CGFloat?


  override func viewDidLoad() {
      super.viewDidLoad()
      // Do any additional setup after loading the view, typically from a nib.
  }

  override func didReceiveMemoryWarning() {
      super.didReceiveMemoryWarning()
      // Dispose of any resources that can be recreated.
  }

  public func printArea(){
      print("Print area in Super class")
  }

  public func calculateArea(){

  }

}

ViewControllerA作为子类:

import UIKit

class ViewControllerA: ViewController {

    var length:                 CGFloat?


     init( len: CGFloat) {
        self.length = len
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func printArea() {
        print("The are of A \(area!)")
    }


    override func calculateArea() {
        area = length! * length!
    }
}

我收到了错误。 子类init方法中的Must call a designated initializer of the superclass 'ViewController'

所以我在超类中声明了空init方法,即ViewController

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nil, bundle: nil)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

它对我有用。