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

我做了一个包装Alamofire的框架。

在我的框架时,testing(在testing目标)我有这个代码,工作格栅。

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 } } 

我收到一个错误:

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

所以我加了Super.init()

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

现在我得到这个错误:

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

任何想法是什么问题?

您需要在Router声明一个空的public init() {}

虽然这是一个神秘的错误,但问题在于子类不能调用super.init()因为除非你声明它是public否则初始化程序不能在NetworkManager模块外部访问。 在Router自动生成的init()默认是不public的。

它在你的testing类中工作,因为@testable import了默认的internal访问限制。

我试图创build一个Swift编程的inheritancefunction。

我创build了超级类的ViewController 。 然后,我创build了另一个类作为超类ViewController ViewControllerA的子类名称

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! } } 

我有错误。 Must call a designated initializer of the superclass 'ViewController'在子类init方法中Must call a designated initializer of the superclass 'ViewController'

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

 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") } 

它为我工作。