初始化函数返回之前,所有路径上都没有调用 super init 方法。

4

我制作了一个包装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
}

现在我得到了这个错误:

超类初始化器不能在初始化器之外被调用

你有什么想法这是什么问题吗?


1
请展示 Router 实现(初始化方式)。 - shallowThought
路由器中没有初始化。 - ilan
1
那就是问题所在。你需要为子类提供一些公共的初始化方法来调用。 - Rob Napier
那么为什么它在测试目标上能够工作? - ilan
因为你使用了@testable,所以你可以看到内部方法。你需要一个公共的方法来看到框架外部。去掉@testable,我敢打赌它与其他导入器具有相同的行为。 - Rob Napier
3
这是与 https://bugs.swift.org/browse/SR-2295 相关的内容。 - Mat
2个回答

4
您需要在Router中声明一个空public init() {}。 虽然这是一个晦涩的错误,但问题在于子类无法调用super.init(),因为该初始化程序除非您将其声明为public,否则无法在NetworkManager模块之外访问。在Router中自动生成的init()默认情况下不是public的。 它在您的测试类中工作是因为 @testable import 规避了默认的internal访问限制。

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

我发现了一个错误。

在子类的初始化方法中,必须调用父类“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")
}

这对我有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接