Если у меня есть два протокола, связанный тип которых совпадает, например
protocol Read {
associatedtype Element
func read() -> Element
}
protocol Write {
associatedtype Element
func write(a: Element)
}
Тогда я хотел бы иметь класс для чтения целого числа и записи строки в:
class ReadWrite: Read, Write {
func read() -> Int {
return 5
}
func write(a: String) {
print("writing \(a)")
}
}
но компилятор жалуется и предлагает заменить String
на Int
. В идеале тип должен быть выведен или, по крайней мере, компилирован, если я явно объявляю
associatedtype Read.Element = Int
associatedtype Write.Element = String
в пределах ReadWrite
. Любая работа?
Обновить
Обходной путь, вдохновленный этим вопросом, заключается в создании двух вспомогательных протоколов.
protocol ReadInt: Read {
associatedtype Element = Int
}
protocol WriteString: Write {
associatedtype Element = String
}
и вместо этого унаследовать класс от этих двух:
class ReadWrite: ReadInt, WriteString {
func read() -> Int {
return 5
}
func write(a: String) {
print("writing \(a)")
}
}
Кажется, это компилируется, но я боюсь, что в этом случае возникнут какие-либо ошибки.
обновить снова
Я обнаружил проблему в системе отслеживания проблем Swift. Любой, кому нужна эта отсутствующая функция (например, я), должен проголосовать за нее. Для сравнения: этот шаблон возможен в Rust, который также поддерживает связанные типы (хотя это не идиоматическое использование).
FYMyLibElement
. Эта проблема не такая уж редкость, например, в пакете Foundation есть много протоколов, использующих одни и те же связанные имя типа Элемент. - person Franklin Yu   schedule 10.06.2016Self.Generator.Element
, поэтому я считаю, что нам просто нужно запросить прямой доступ к квалифицированному имени. - person Franklin Yu   schedule 16.06.2016