为了账号安全,请及时绑定邮箱和手机立即绑定

带“ where Self”子句的Swift协议

带“ where Self”子句的Swift协议

除了带有协议扩展的语法外: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标头似乎没有使用它。
查看完整描述

3 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

在Swift 5中,您将编写protocol P where Self : C, Self : Decodable {}or protocol P where Self : C & Decodable {}protocol P : C, Decodable {}。然而,在Swift 4.x中,正如我的答案所讨论的,编译器不支持这种构造。

查看完整回答
反对 回复 2019-09-26
?
慕容3067478

TA贡献1773条经验 获得超3个赞

IMO的改变是有道理的-协议派生(即protocol P2 : P1)在语义上应等效于对的约束Self,即protocol P2 where Self : P1。因此,如果您允许protocol P2 where Self : SomeClass,也允许它似乎是合乎逻辑的protocol P2 : SomeClass(尽管如此,我很欣赏如何将其容易地误认为继承)。

查看完整回答
反对 回复 2019-09-26
  • 3 回答
  • 0 关注
  • 1393 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信