我制作了一个包装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不能在初始化程序之外调用
知道这是什么问题吗?
答案 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")
}
它对我有用。