除了使用协议扩展的这种语法:
protocol P {}
extension P where Self : UIView {}
我偶然发现,您可以在协议本身上使用相同的 where 子句:
Translated text:我偶然发现,您可以在协议本身上使用相同的 where 子句:
protocol P where Self : UIView {}
请注意,此处所述的“: <Type>”语法不同于限制泛型协议的where从句,它本身并不会使P成为泛型协议。
我的实验似乎表明这里只能使用冒号,冒号后面的内容必须是一个类或协议(可以是泛型的)。
我变得好奇:这是怎么逃脱我注意力的?所以我开始搜寻证据,看看它是在什么时候出现的。在Swift 3.0中,前一种语法合法,但后一种是非法的。在Swift 3.3中,两种语法都是合法的。因此,后一种语法必须是在类似Swift 3.2的版本中悄悄引入的。我说“悄悄”的原因是我在发布说明中找不到任何关于它的内容。
第二个语法是用来干什么的呢?正如它所显示的那样,它只是一种方便的方式,确保没有其他类型可以采用这个协议吗?Swift头文件似乎没有使用它。
where Self : UIView
是 SE-0156 的意外结果,该功能尚未完全实现(其实编译器应该在准备好之前拒绝此语法)。目前它还存在许多问题,因此我建议暂时避免使用它 - 参见 https://dev59.com/RFYO5IYBdhLWcg3wKemM#50647762。 - Hamish