#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 // реализовать необходимые свойства протокола в расширении тестового класса }