将 Swift 中的协议与 Java 中的接口进行比较

2022-08-31 06:43:19

我正在从Apple开发人员页面浏览iOS教程。

在我看来,这几乎具有相同的功能。protocolinterface

  • 两者之间有什么区别吗?

  • 项目中的不同用法?

更新

是的,我确实阅读了上面的链接,我仍然不确定 和 之间的区别和用法是什么。当我问这样的问题时,我希望看到关于这个主题的简单解释。有时可能很难从文档中获取所有内容。protocolinterface


答案 1

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

  • Swift 协议还可以指定必须实现的属性(即字段)
  • Swift 协议需要通过使用 mutating 关键字来处理值/引用(因为协议可以通过结构、枚举或类来实现)。
  • 您可以使用“协议组合”随时组合协议。这取代了旧的快速协议组合方式。例如,声明一个必须遵守协议的函数参数,并作为:protocol<A, B>NamedAged
    func wishHappyBirthday(to celebrator: Named & Aged) {}

这些是Java开发人员立即明显的差异(或者至少是我迄今为止发现的)。这里有更多信息。


答案 2

补充@Thomas沙尔的回答。Swift 协议的魔力来自扩展。

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

让我挠头几个小时的一件事是,并非所有协议都可以用作属性类型。例如,如果你有一个带有typealias的协议,你不能直接将其用作一种属性类型(当你考虑它时,它是有道理的,但是来自Java,我们真的希望拥有一个像userDao:IDao这样的属性)。


推荐