在从初始化程序返回之前,不会在所有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") }
它为我工作。