在Swift中比较协议和Java中的接口
我正在通过苹果开发者页面的iOS教程。
在我看来, protocol
和interface
几乎具有相同的function。
-
两者有什么分别吗?
-
项目中的不同用法?
更新
是的 ,我没有阅读上面的链接,我仍然不确定protocol
和interface
之间的差异和用法。 当我问这样的问题时,我想看一个关于这个话题的简单解释。 有时从文档中获取所有内容可能很困难。
基本上协议与Java接口非常相似,除了:
- Swift协议也可以指定必须实现的属性(即字段)
- Swift协议需要通过使用mutating关键字来处理值/引用(因为协议可以通过结构和类来实现)
- 您可以将协议随时与协议<>关键字结合使用。 例如,声明一个必须遵守协议A和B的函数参数:
。
func foo ( var1 : protocol<A, B> ){}
这些对于Java开发人员来说是非常明显的差异(或者至less是我迄今发现的)。
补充@Thomas Schar的答案。 Swift协议魔术来自扩展。
- Swift协议可以通过扩展来实现(Swift
2)。 Java 8接口可以有默认的实现,但不能“追溯”。 - 在迅速您可以“追溯”添加协议要求(和
它的实现如果需要的话)到任何类或结构。 - Swift协议不遵循通用(即<..>)定制模式,而是一个typealiasscheme(即关联types)。 可以在开始时混淆,但可以避免
在某些情况下“angular度支架失明”。 - Swift有一个先进的types模式匹配,可以非常详细地说明协议需求和扩展如何应用。 来自Java的时候可能会感到困惑,但是它有很多的力量。
- Swift协议可以组成一个属性/参数(即庆祝者:协议)
有一件事让我挠了头几个小时,并不是所有的协议都可以用作属性types。 例如,如果你有一个带有typealias的协议,你不能直接使用它作为一个属性的types(当你考虑它时有意义,但是来自Java我们真的想拥有一个像userDao:IDao这样的属性)。