2017-10-06 3 views
1

Ich versuche herauszufinden, wie eine Standard-Protokollinitialisiererimplementierung in einer Protokollerweiterung erstellt wird, die implementierende Typen erben können.Swift 4 Protokollerweiterung - Convenience Initializer Standardimplementierung

Es sieht ungefähr so ​​aus:

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

ich mit dem folgenden Compiler-Fehler am Ende:

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

+0

'EntityType()' wie wissen Sie, 'EntityType' hat' init() '? –

+0

Aktualisierte die Frage. 'EntityType' gehört zu einer ConcreteClass mit einer 'public init()'. Der Container wird tatsächlich mit einem anderen Objekt initialisiert. – Cyupa

+0

Es gibt verschiedene 'EntityType' Symbole in jeder Klasse. In Container hat es nicht init(), weil es nur Codable ist, nicht von ConcreteClass abgeleitet. –

Antwort

1

Sie verwenden verschiedene init in Protokoll und Erweiterung.

init(type: EntityType) 

Sie müssen Realisierung der Methode init() in Erweiterung implementieren oder in der Klasse

+0

ein Ich habe die Frage aktualisiert, es ist eher eine allgemeine Frage, aber jetzt sollte es vollständig den vorhandenen Code übereinstimmen. Die 'Configuration' Klasse ist nur eine andere Klasse. – Cyupa

+0

@Cyupa Ihr Fehler ist, weil Sie die Realisierung von init (config :) Methode, und rufe innerlich self.init() auf Aber du fügst die Realisierung der init() - Methode nicht hinzu Du musst sie der Erweiterung oder Klasse hinzufügen oder sie löschen und nicht von init (config :) – maxkoriakin

Verwandte Themen