在Swift中比较协议和Java中的接口

我正在通过苹果开发者页面的iOS教程。

在我看来, protocolinterface几乎具有相同的function。

  • 两者有什么分别吗?

  • 项目中的不同用法?

更新

是的 ,我没有阅读上面的链接,我仍然不确定protocolinterface之间的差异和用法。 当我问这样的问题时,我想看一个关于这个话题的简单解释。 有时从文档中获取所有内容可能很困难。

基本上协议与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这样的属性)。