Протокол '...' как тип не может соответствовать '...' — общий протокол общей проблемы протокола

Я играл со 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, не заботясь о том, «как» объект хранится. Этот подход предназначен для уменьшения количества «повторяющегося» кода.

Я потратил пару дней, пытаясь разобраться с этой проблемой, но я не могу найти решение, которое соответствует этой конкретной проблеме. Я, наверное, просто немного поплачу в углу ... если у кого-нибудь есть идеи о том, как я мог бы решить эту проблему, я был бы признателен.

(Да, я гуглил, но не нашел ничего, что соответствовало бы структуре, похожей на то, что я «приснился»)

Быстрый Быстрый

0 ответов

Другие вопросы по тегам