В дополнение к этому синтаксису с расширением протокола:
protocol P {}
extension P where Self : UIView {}
... Я случайно обнаружил, что вы можете использовать одно и то же предложение where в самом протоколе:
protocol P where Self : UIView {}
Обратите внимание, что это не то же самое, что и предложение where, ограничивающее общий протокол, и сам не делает P общим протоколом.
Мои эксперименты показывают, что здесь можно использовать только двоеточие, а вещь после двоеточия должна быть классом или протоколом (который может быть общим).
Мне стало любопытно: как это удалось избежать моего уведомления? Поэтому я отправился на поиски свидетельств того, когда он возник. В Swift 3.0 прежний синтаксис легален, но не последний. В Swift 3.3 оба являются законными. Таким образом, последний синтаксис должен был быть тихо введен в нечто вроде Swift 3.2. Я говорю "спокойно", потому что ничего не могу найти в примечаниях к выпуску.
Для чего нужен второй синтаксис? Похоже, это просто удобный способ убедиться, что ни один другой тип не может принять этот протокол? Заголовки Swift, похоже, не используют его.