Маркировка CacheManager с помощью 'class' решила мою проблему.
Вот случай: простой кэширующий , мутантное получение не то, что я хочу, так какчто делать для ссылочных типов или просто для типов классов?
protocol Cacher {
associatedtype K
associatedtype V
subscript (key: K) -> V? {get set}
}
protocol MemoryCacher: Cacher {}
protocol FileCacher: Cacher {}
updated . добавить PrimayCacher |Дополнительные типы SecondaryCacher
protocol CacheManager {
associatedtype Key
associatedtype Value
associatedtype PrimaryCacher: MemoryCacher where PrimaryCacher.K == Key, PrimaryCacher.V == Value
associatedtype SecondaryCacher: FileCacher where SecondaryCacher.K == Key, SecondaryCacher.V == Value
var primaryCacher: PrimaryCacher { get set }
var secondaryCacher: SecondaryCacher{ get set }
subscript(key: Key) -> Value? { get set }
}
//try to provide a default subscript conformance, but actually not for the `mutating` get
extension CacheManager {
subscript(key: Key) -> Value? {
mutating get {
guard let result = primaryCacher[key] else {
if let value = secondaryCacher?[key] {
primaryCacher[key] = value // the mutating is required for this
return value
}
return nil
}
return result
}
set {
primaryCacher[key] = newValue
secondaryCacher?[key] = newValue
}
}
}