iOS Swift 中的面向协议编程

17 Mar 2025 | 4 分钟阅读

Swift 通过协议在 iOS 应用程序中支持面向协议的编程,协议是 Swift 编程语言的基本特性。协议在 Swift 标准库的结构中起着至关重要的作用。 然而,协议用于定义方法、属性和其他完成特定任务所需的主要功能的蓝图。 它提供了一种在 Swift 编程语言中实现抽象的方法。 简单来说,我们可以说协议就像其他一些编程语言中的接口。

在本文中,我们将讨论 Swift 中基本的编程范例之一,即面向协议的编程。 在这里,我们将讨论面向对象和面向协议编程之间的差异,包括 swift 中协议的默认实现。

什么是面向协议的编程?

通过使用面向协议的编程,我们可以将相似的方法、函数和属性分组。 我们可以为类、枚举和结构体类型指定协议。 但是,只有类类型可以使用继承功能。

当我们的类需要从两个不同的课程继承时,即类需要具有两个不同类的属性时,面向协议的编程就出现了。 在这里,我们可以定义协议,该协议提供了一个优势,即我们的类可以符合多个协议。

这使我们的代码更加模块化,因为协议可以被视为功能的基本构建块。 如果我们需要在应用程序中添加一些新功能,我们可以将不同的构建块添加到我们的类中,并相应地在我们的主类中定义这些块,而不是构建一个实现该功能的全新类。

让我们使用以下代码创建两个协议。

上面的代码将两个协议定义为 Bank 和 Company。 如果我们使用面向对象的范例来实现这一点,我们可以使用 Company 作为基类,而 Bank 作为子类。 但是,在面向协议的范例中,我们将所有内容都用作协议。 这使我们能够在不使用基类的情况下封装功能概念。

协议一致类型

让我们定义以下符合我们的 Bank 和 Company 协议的结构。

此代码定义了一个新的结构 RBI,该结构符合我们的协议,即 Bank 和 Company。 RBI 为客户指定了利率。

现在,让我们添加以下结构,该公司是一家公司,但不包含 Bank 的属性。

我们可以使用协议定义功能组件,并使用任何可以符合它们的相关对象。 现在,让我们尝试扩展协议,该协议允许我们定义协议的默认行为。

现在,我们可以从 RBI 结构中删除 rateOfInterest。 如果我们再次构建 playground,我们会注意到 playground 仍然会成功构建,因为协议扩展处理了该需求。

枚举的一致协议

枚举具有比 CC++ 中的枚举更多的功能。 它也可以符合以下协议。

覆盖默认行为

现在,我们必须注意,枚举 Banks 通过符合 Bank 协议自动接收 isRegistered 属性的实现。 我们可以使用以下代码覆盖 Bank 协议的默认行为。

现在,如果我们为 .SBI 和 .PNB 打印 isRegistered 属性,则只有 .RBI 将为 isRegistered 属性返回 true,它将为两者都打印 false。

这是一种覆盖属性和方法的方式,就像我们在面向对象编程中覆盖虚方法一样。

扩展协议

我们还可以使我们的类符合协议,以使用协议功能和属性。 在以下代码中,我们的协议 Drawable 能够在屏幕上绘制一些内容。 我们的协议 Circle 具有 radius 属性,其中我们的 Main 类符合 Circle 协议以覆盖 radius 属性以设置新的半径。 我们的类还符合 Drawable,用于提供 draw() 方法的定义。

输出

"Drawing Circle with 10.2 radius"

协议比较器

Swift 协议的功能之一是我们如何比较两个对象是否相等、大于或小于。 让我们实现以下代码来比较协议对象。