Как определить протокол, который специализируется на обобщенном протоколе c, чтобы его можно было использовать в объявлениях типов? - PullRequest
2 голосов
/ 20 февраля 2020

Я 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>, это противоречит принципу инверсии зависимостей.

Можно ли специализировать протокол с ассоциированным типом и при этом поддерживать уровень абстракции?

1 Ответ

1 голос
/ 20 февраля 2020

Если я правильно понял вопрос ... Попробуйте:

protocol ValueStoreType {
  associatedtype Value
  var value: Value? { get set }
}

struct ValueStore<T>: ValueStoreType {
  var value: T?
}

Тогда вы сможете сделать:

var stringStore: ValueStore<String>
...