Я Android разработчик, изучающий iOS разработку, и я сталкиваюсь с этой проблемой, которая тривиальна с интерфейсами Kotlin / Java, но я не могу пройти через это с протоколами Swift.
Скажем, у нас есть этот протокол:
protocol ValueStore {
associatedtype Value
var value: Value? { get set }
}
В Kotlin / Java, если я хочу использовать абстракцию generi c для определения типа переменной, я просто использую интерфейс generi c с параметром типа:
val stringStore: ValueStore<String>
Поскольку это невозможно в Swift, я попытался создать специализированный суб-протокол, который определяет связанный тип:
protocol StringStore: ValueStore where Value == String { }
с намерением использовать последнее вроде этого:
let stringStore: StringStore
Приведенное выше заявление - это то, чего я пытаюсь достичь. Тем не менее, компилятор говорит мне Protocol 'StringStore' can only be used as a generic constraint because it has Self or associated type requirements
.
Хотя в объявлениях типов я могу использовать специализированную конкретную реализацию generi c, т.е. UserDefaultsValueStore<String>
, это противоречит принципу инверсии зависимостей.
Можно ли специализировать протокол с ассоциированным типом и при этом поддерживать уровень абстракции?