Необщий протокол, используемый в качестве конкретного типа, не соответствует самому себе

Я добрался до этого странного ограничения компилятора в Swift 3.1, проверенном на игровой площадке. Любое решение?

введите здесь описание изображения

Похоже на ошибку компилятора, предложения? Спасибо :)


person acecilia    schedule 13.04.2017    source источник
comment
Да, протоколы не соответствуют сами себе — вы не можете использовать Protocol1 как тип, соответствующий Protocol1. Это не ошибка, это так задумано.   -  person Hamish    schedule 13.04.2017
comment
Спасибо за ответ. Не имеет смысла, верно? Вот такое бессмысленное ограничение..   -  person acecilia    schedule 13.04.2017
comment
Это имеет смысл. Подумайте, есть ли у вас требование протокола static на Protocol1 — если бы у меня было func foo<T : Protocol1>(_: T.Type) {}, я мог бы получить доступ к требованиям статического протокола на T. Вы не можете получить доступ к статическим требованиям к типу протокола, только к конкретным типам, поэтому позволять протоколам соответствовать самим себе неразумно. Однако я согласен с тем, что обходной путь (стирающие ластики) довольно банален — надеюсь, в будущей версии языка Swift будет поддерживать некоторую языковую функцию, чтобы облегчить это бремя.   -  person Hamish    schedule 13.04.2017
comment
@Hamish Я действительно не вижу смысла в том, что вы сказали о требовании статического протокола, я проверил ваше предложение, и результат здесь: imgur.com/iFbZA0m   -  person acecilia    schedule 14.04.2017
comment
Я говорил о вызове статических требований к T, а не param (который в вашем примере является экзистенциальным метатипом, поэтому работает нормально). Честно говоря, это был не лучший пример — я проиллюстрировал (надеюсь) лучший пример в мом ответе на связанные вопросы и ответы здесь< /а> :)   -  person Hamish    schedule 14.04.2017
comment
Ого, совсем забыл, что я уже ответил в основном на этот точный вопрос здесь - продолжу и закрою как обман оба :)   -  person Hamish    schedule 15.04.2017


Ответы (1)


Да, протоколы, используемые как конкретные типы, могут не соответствовать сами себе. Это объясняется Хэмишем здесь, а также здесь есть отчет об устраненной ошибке JIRA из проекта Swift. Обе ссылки содержат код, позволяющий понять проблему.

person acecilia    schedule 14.04.2017