Как принудительно согласовать associatedtype

#swift

#swift

Вопрос:

У меня есть вопрос об использовании associatedtype в общем протоколе. В следующем примере я пытаюсь создать общий постоянный идентификатор с элементом связанного типа, соответствующим NSCoding

 protocol Persister {
    
    associatedtype Item : AnyObject, NSCoding
    
    var itemCount: Int {get set}
    
    mutating func removeValue(at key: String?)
    
    mutating func store(_ item: Item?, for key: String?)
    
    subscript(index: String) -> Item? {get set}
    
}


extension Persister {
    mutating func store(_ item: Item?, for transactionIdentifier: String?) {
        if let id = transactionIdentifier {
            self[id] = item
        }
    }
    
    mutating func removeValue(at key: String?){
        store(nil, for: key)
    }
}


protocol PendingCreationPersister:  Persister where Item : PendingCreation{}
  

или

 extension PendingCreationPersister where Item : PendingCreation{}
  

используя этот общий постоянный идентификатор в качестве свойства в классе, например:

 var persistentList : PendingCreationPersister
  

появится сообщение об ошибке: «Протокол’PendingCreationPersister’ может использоваться только в качестве общего ограничения, поскольку он имеет собственные или связанные требования к типу», даже если тип associatedtype указан в дочернем протоколе PendingCreationPersister. Как я мог предотвратить эту проблему?

Комментарии:

1. создайте универсальную структуру, используя ваш протокол в качестве ограничения для универсального типа. Используйте общий тип для вашего свойства вместо протокола

2. тест класса { } Тест расширения: PendingCreationPersister { typealias Item = PendingCreation // реализовать необходимые свойства протокола в расширении тестового класса }