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

Bun*_*Bun 134 java swift

我正在浏览Apple开发者页面的iOS教程.

在我看来protocol,interface几乎具有相同的功能.

  • 这两者有什么不同吗?

  • 项目中的差异用法?

更新

是的,我看过上面的链接,我仍然不知道什么区别之间使用protocolinterface.当我提出这样的问题时,我想看一个关于这个主题的简单解释.有时从文档中获取所有内容可能很困难.

Tho*_*har 104

基本上协议与Java接口非常相似,除了:

  • Swift协议还可以指定必须实现的属性(即字段)
  • Swift协议需要通过使用mutating关键字来处理值/引用(因为协议可以通过结构和类来实现)
  • 您可以随时使用协议<>关键字组合协议.例如,声明必须遵守协议A和B的函数参数:

.

func foo ( var1 : protocol<A, B> ){}
Run Code Online (Sandbox Code Playgroud)

这些是Java开发人员的明显差异(或者至少是我到目前为止发现的).

  • "_the protocol <> keyword_":真的很酷!我认为这就是类型系统理论界所谓的_intersection type_.对于Java,您只能为具有多个边界的类型参数提供此类型.[本文](http://www.cs.rice.edu/~javaplt/papers/oopsla2008.pdf)建议在Java中将它们作为第一类类型引入,并使用语法来表示它们. (11认同)
  • 很好的总结.一些更重要的特性:Swift协议还可以指定相关的类型要求 - 例如,集合类型具有关联的索引类型,或者类似的类型的比较方法需要相同类型的参数.在Swift 2.0中,协议扩展可以为满足协议要求的类型添加实际功能. (6认同)
  • 现在已删除协议<>关键字以支持&符号.所以你可以写:让c:A&B (5认同)
  • @rickster Java 8也可以通过使用“默认” [关键字](https://en.wikipedia.org/wiki/List_of_Java_keywords)标记方法来向接口添加实现。请参见[Oracle教程](http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html)。 (2认同)
  • 在Swift中,使用协议名称而不是接口,因为在C中的Objective C头文件(无用的重复项)被称为接口 (2认同)

Jer*_*one 31

补充@Thomas Schar的答案.Swift协议魔法来自扩展.

  • Swift协议可以通过扩展(Swift
    2)实现.Java 8接口可以具有默认实现,但不能"追溯"完成.
  • 在swift中,您可以"追溯"将协议要求(
    及其实现,如果需要)添加到任何类或结构.
  • Swift协议不遵循通用(即<...>)自定义模式,而是遵循类型方案(即关联类型).在开始时可能会令人困惑,但
    在某些情况下可以避免"斜角失明".
  • Swift具有高级类型模式匹配,允许非常具体地说明协议要求和扩展的应用位置和方式.来自Java时可能会让人感到困惑,但它有很多功能.
  • Swift协议可以为属性/参数组成(即庆祝者:协议)

让我头疼几个小时的一件事是,并非所有协议都可以用作属性类型.例如,如果你有一个带有typealias的协议,你就不能直接将它作为一种属性使用(当你考虑它时它是有意义的,但是从Java开始我们真的想拥有像userDao这样的属性:IDao).

  • 与Java接口不同,Swift协议也可以有可选成员. (5认同)
  • 在Swift中总是出现的一个小问题是,(荒谬地)没有抽象函数,所以你只需要"打印就忘了这个!" ... http://stackoverflow.com/a/24111430/294884 (3认同)