【发布时间】:2018-06-18 15:51:28
【问题描述】:
除了这个带有协议扩展的语法:
protocol P {}
extension P where Self : UIView {}
...我偶然发现您可以在协议本身上使用相同的 where 子句:
protocol P where Self : UIView {}
请注意,这不与限制通用协议的 where 子句相同,并且 not 本身是否使 P 成为通用协议。
我的实验似乎表明这里只能使用冒号,冒号后面的东西必须是类或协议(可能是泛型的)。
我开始好奇:这怎么会逃过我的注意?所以我去寻找它何时出现的证据。在 Swift 3.0 中,前一种语法是合法的,但 不是 后者。在 Swift 3.3 中,两者都是合法的。所以后一种语法一定是在 Swift 3.2 之类的东西中悄悄引入的。我说“悄悄地”是因为我在发行说明中找不到任何关于它的信息。
第二种语法是干什么用的?看起来,它只是一种确保没有其他类型可以采用该协议的便捷方式吗? Swift 标头似乎没有使用它。
【问题讨论】:
-
能够在协议声明中说出
where Self : UIView是SE-0156 的意外结果——该功能本身尚未完全实现(实际上编译器应该在准备好之前拒绝该语法)。它目前周围有很多锋利的边缘,所以我现在要避开它——见stackoverflow.com/a/50647762/2976878。 -
@Hamish 该评论足以成为答案,imo
-
@Alexander 嗯,它确实大部分重复了我在链接答案中已经说过的东西,但我想它更容易作为这个问题的答案......是的,好吧,我会写一个答案: )
-
Swift 论坛中可能相关的话题:What happens when a protocol is constrained to inherit from a class?
标签: swift where swift-protocols