Протокол '...' как тип не может соответствовать '...' — общий протокол общей проблемы протокола
Я играл со Swift и SwiftUI. Я пытался придумать хранилище данных на основе делегатов для различных «сущностей данных», намерение состояло в том, чтобы иметь возможность заменить базовые реализации хранилища данных, сохраняя при этом стабильный интерфейс кода (это экспериментальная база кода, поэтому я хочу поиграть с разными хранилищами данных с течением времени)
После нескольких попыток я пришел к выводу, что большая часть работы верхнего уровня повторялась (и в конечном итоге я в основном справлялся со вставкой шаблонного кода), поэтому я подумал, что буду умнее и сократлю и повторно использую понятия, глупый я.
Итак, я начал с базового делегата, который содержит «основные»/«общие» функции, которые должен уметь выполнять каждый делегат.
protocol SomeDelegateProtocol {
associatedtype Item
func performActionOn(_ item: Item)
// Lots of common actions which can
// be performed on entities
}
Вместе с концепцией «общего» «менеджера» верхнего уровня (реализации, через которые будет работать приложение, поэтому мы разделяем слои)
class SomeManager<Delegate: SomeDelegateProtocol> {
typealias Item = Delegate.Item
let delegate: Delegate
@Published var items: [Delegate.Item]
// Other properties
init(delegate: Delegate) {
self.delegate = delegate
}
// Lots of boiler plate functionality
}
Теперь для каждой сущности нам нужно определить целевого делегата и менеджера.
protocol OtherItemProtocol {
// Item enity properties
}
protocol OtherDelegateProtocol: SomeDelegateProtocol where Item == any OtherItemProtocol {
// Specific functionality for this delegate
}
class OtherManager: SomeManager<OtherDelegateProtocol> {
// Specific functionality for type of manager
}
И тут я сталкиваюсь с проблемами. На моем Xcode/Swift жалуется, что:
Протокол «OtherDelegateProtocol» как тип не может соответствовать «SomeDelegateProtocol»
Под Swift 5.7 я получаю немного другую ошибку
Тип «любой OtherDelegateProtocol» не может соответствовать «SomeDelegateProtocol».
Просто для (немного) ясности. Большая часть кода приложения будет использовать реализацииSomeManager
, например, код, который должен иметь дело сOtherItemProtocol
будет работать напрямую черезOtherManager
, не заботясь о том, «как» объект хранится. Этот подход предназначен для уменьшения количества «повторяющегося» кода.
Я потратил пару дней, пытаясь разобраться с этой проблемой, но я не могу найти решение, которое соответствует этой конкретной проблеме. Я, наверное, просто немного поплачу в углу ... если у кого-нибудь есть идеи о том, как я мог бы решить эту проблему, я был бы признателен.
(Да, я гуглил, но не нашел ничего, что соответствовало бы структуре, похожей на то, что я «приснился»)