2016-12-06 6 views
2

Alamofireをラップするフレームワークを作成しました。初期化子から戻る前にすべてのパスでsuper initが呼び出されない

私のフレームワークでは、(テストターゲットで)テストするとき、私はこのコードをgrateしています。

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 isn't called on all paths before returning from initializer

だから私は(でsuper.initを追加しました)

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

これでエラーが表示されます:

super.init cannot be called outside of an initializer

何が問題なのですか?

+1

'Router'実装(初期化子のwize)を表示してください。 – shallowThought

+0

ルータ – ilan

+1

には初期化がありません。それは問題です。サブクラスが呼び出すための初期化子が必要です。 –

答えて

3

public init() {}を空白としてRouterに宣言する必要があります。

それは不可解なエラーだが、問題はその初期化子がNetworkManagerモジュールの外からアクセスできませんので、あなたがpublicとしてそれを宣言しない限り、サブクラスがsuper.init()を呼び出すことはできませんということです。 Routerに自動的に生成されるinit()は、デフォルトではpublicではありません。

@testable importがデフォルトのアクセス制限であるinternalを回避したため、テストクラスで機能しました。

0

私はSwift Programmingの継承機能を作成しようとしていました。

スーパークラスとして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: はその後、私はスーパークラスのViewControllerAViewController

のViewControllerクラスとサブクラスの名前として別のクラスを作成し

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'

だから私はそれは私のために働い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") 
} 

スーパークラスすなわち、空initメソッドを宣言。

関連する問題