2017-10-06 29 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()的()'你怎么知道'EntityType'有'的init()'? –

+0

更新了问题。 'EntityType'是具有'public init()'的ConcreteClass。 Container实际上是用另一个对象初始化的。 – Cyupa

+0

每个类中都有不同的'EntityType'符号。在Container中它没有init(),因为它只是Codable,而不是从ConcreteClass派生。 –

回答

1

您在协议和推广使用不同的初始化。

init(type: EntityType) 

您必须扩展或类

+0

我已经更新了这个问题,它更像是一个通用的问题,但现在它应该完全匹配现有的代码。'Configuration'类只是另一个类。 – Cyupa

+0

@Cyupa你的错误是因为你添加了init(config :)方法,并在里面调用self.init(),但是你不要添加init()方法的实现,你必须将它的实现添加到扩展或类中,或者删除它并且不要从init(config :)调用 – maxkoriakin