2

共通の初期化コードを共有する一連のクラスを構築しようとしています。継承とは別に、プロトコルが進むべき道だと思いました。プロトコルとプロトコル拡張はインスタンス メソッドと静的メソッドで機能しましたが、初期化子で機能させるにはいくつか問題があります。

このプロトコルがあるとしましょう:

protocol CloudServiceWrapper {

    static var isConfigured: Bool { get }

    init()

    func initialize()

}

isConfiguredここで、 と の両方にデフォルトの実装を追加したいとしましょうinit():

extension CloudServiceWrapper {

    static var isConfigured: Bool {
        get {
            return true
        }
    }

    init() {
        print("Initializing generic CloudServiceWrapper")
        self.init()
        if Self.isConfigured {
            initialize()
        }

    }

}

最後に、このプロトコルを実装し、そのデフォルトの実装から利益を得ようとするクラスを作成しましょう。

class OneDriveWrapper: CloudServiceWrapper {

    required init() {
        // CloudServiceWrapper() // error: protocol type 'CloudServiceWrapper' cannot be instantiated
        // self = CloudServiceWrapper.init() // error: cannot assign to value: 'self' is immutable
        // super.init() // error: 'super' members cannot be referenced in a root class
        // (self as CloudServiceWrapper).init() // error: static member 'init' cannot be used on instance of type 'CloudServiceWrapper'
        print("Initializing OneDriveWrapper")
    }

    func initialize() {
        print("Done")
    }

}

クラスの新しいインスタンスを構築しようとするOneDriveWrapperと、クラスの初期化子とデフォルトのプロトコル実装の両方を呼び出す方法を見つけることができません。また、プロトコル定義ごとに必要であり、プロトコル拡張で「実装」されているとは見なされていないように見えるためinit()、クラスでを省略することはできません。OneDriveWrapper

実際、もっと広く言えば、プロトコル拡張の初期化子を明示的に呼び出す方法を見つけることができませんでした。インスタンス メソッドでは可能だとわかっていたにもかかわらずです。

私は何を間違っていますか?クラスのイニシャライザとプロトコル拡張のイニシャライザの両方を組み合わせる方法を知っていますか? プロトコルと拡張機能ではなく、クラス継承にフォールバックする必要がありますか?

ありがとう!

4

3 に答える 3