2017-10-06 20 views
1

タイプを実装できるプロトコル拡張でデフォルトのプロトコルイニシャライザ実装を作成する方法を理解しようとしています。Swift 4プロトコル拡張 - 簡易イニシャライザのデフォルト実装

それは、このようなものになります。私は、次のコンパイラエラーで終わる

protocol Initializable { 
    associatedtype EntityType: ConcreteClass 
    var container: Container<EntityType> { get set } 
    init() 
} 

class Container<T: ConcreteClass> { 
    typealias EntityType = T 
    let configuration : Configuration 

    init(config: Configuration) { 
     configuration = config 
    } 

    func getAll() -> [EntityType] { 
     return [EntityType()] 
    } 
} 

extension Initializable { 
    init(config: Configuration) { 
     self.init() 
     self.container = Container<EntityType>(config: config) 
    } 
} 

final class Repo: Initializable { 
    typealias EntityType = String 
    var container: Container<String> 
} 

を:

Type 'Repo' does not conform to protocol 'Initializable'. Candidate has non-matching type 'init(type: EntityType.Type)'

+0

'EntityType拡張またはクラスのメソッドのinit()の実現を実装する必要がありますか? –

+0

質問が更新されました。 'EntityType'は 'public init()'を持つConcreteClassです。 'Container'は実際に別のオブジェクトで初期化されます。 – Cyupa

+0

各クラスには異なる「EntityType」シンボルがあります。 Containerでは、ConcreteClassから派生したものではなく、単なるCodableなので、init()はありません。 –

答えて

1

あなたは、プロトコルおよび拡張で異なるのinitを使用します。

init(type: EntityType) 

あなたは `どのように` `EntityType`が)`のinit(持って知っています)(

+0

質問を更新しました。これは一般的な質問ですが、既存のコードと完全に一致する必要があります。 'Configuration'クラスはもう一つのクラスです – Cyupa

+0

@Cyupaエラーは、init :)メソッドを呼び出し、内部でself.init()を呼び出しますが、init()メソッドの実装を追加しないでください。拡張機能やクラスに実装を追加するか、削除してinit()から呼び出しません。 – maxkoriakin

関連する問題