比较 Swift 协议和 Java 接口协议

我正在学习 苹果开发者页面的 iOS 教程。

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

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

  • 项目中的不同用法?

更新

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

40669 次浏览

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

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

对于 Java 开发人员来说,这些是显而易见的差异(或者至少是我目前所看到的)。还有更多信息 给你

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

  • Swift 协议可以通过扩展实现(Swift
    Java8接口可以有默认的实现,但不能是 做了“追溯”
  • 在 Swift 中,您可以“追溯”添加协议需求(和
    如果需要,它的实现)到任何类或结构。
  • 迅速协议不遵循通用的(即 < . . >)定制模式, 但是一个类型化方案(即关联类型)。开始时可能会混淆,但是可以避免
    在某些情况下是“角括号盲”。
  • 斯威夫特有先进的模式匹配 具体说明协议需求和扩展应用于何处以及如何应用。当它来自 Java 时可能会让人感到困惑,但是它有很强大的功能。
  • 可以为一个 property/param (即庆祝者: 协议)

有一件事让我挠了几个小时的头,那就是并非所有的协议都可以用作属性类型。例如,如果你有一个带有 typealias 的协议,你不能直接使用它作为一种属性类型(当你考虑它的时候,它是有意义的,但是来自 Java,我们真的希望有一个属性,像 userDao: IDao)。

还有一件事,因为我一直在检查协议组合:

您可以在任何时候使用 protocol < > 关键字组合协议。

现在不是这样了。 基于以下 https://github.com/apple/swift/blob/master/test/type/protocol_composition.swift : < a href = “ https://github.com/apple/swift/blob/master/test/type/protocol _ compostion.swift”rel = “ nofollow norefrer”>

这是正确的:

func foo ( var1 : A & B ){}