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)'
'EntityType()' wie wissen Sie, 'EntityType' hat' init() '? –
Aktualisierte die Frage. 'EntityType' gehört zu einer ConcreteClass mit einer 'public init()'. Der Container wird tatsächlich mit einem anderen Objekt initialisiert. – Cyupa
Es gibt verschiedene 'EntityType' Symbole in jeder Klasse. In Container hat es nicht init(), weil es nur Codable ist, nicht von ConcreteClass abgeleitet. –