Swift中的委托是什么?

5分钟内了解

作为面试中的一个常见问题,委托是一种重要的设计模式,已广泛用于iOS开发中。 但是,它的概念对于初学者可能有点抽象。 您可能已经使用过UITableViewDelegate多次,但仍然不知道如何创建自己的委托协议。 或者,您已经阅读了许多文章和示例代码,但仍然不知道何时实施。 在本文中,我将尝试用通俗易懂的语言来解释这个概念,并帮助您立即理解它。

定义

根据Apple的官方文件,

委托是一种设计模式,使类或结构可以将其某些职责移交给(或委托)其他类型的实例。”

您可以将其与“老板/雇员”关系进行比较。 老板注意到产品中的一些问题,而不是自己解决问题,而是将任务委托给员工来解决。 这就是委托模式的工作方式。

因此,让我给您一个简单的示例,说明如何使用它。 想象一下,您有一台智能家居设备,可以控制您的家庭照明系统。 即使您不在家,也可以使用遥控器打开房屋的灯。 这是一个视频,显示我们将要做的事情:

让我引导您完成整个过程。 我假设您已经知道每条步骤说明,并跳过了那些基本内容(按钮,约束设置等)。

OutsideViewController

第11-13行:在其中声明一个名为LightControlDelegate的协议,其中包含函数名称func lightChanged(lighted:Bool) 。 注意,我们不在这里编写函数体。 协议就像老板发送给员工的清单,上面只有命令。 员工是实施它的人; 即,我们将在HomeViewController中编写函数主体。 您将在后面的部分中看到它。

第17行:在OutsideViewController类中,您必须声明一个变量来保存委托。 就像您创建一个接受订单的员工一样。 有人会这样简单地将其命名为“ delegate”: weak var delegate :LightControlDelegate ,但是我更喜欢在其中添加协议名称以使其更具体。
注意:您需要在声明中使用weak var以避免保留循环问题。 此外,您必须将协议类型设置为AnyObject否则编译器会大喊大叫以警告错误。

第24行,第30行:老板决定员工何时开始工作。 在我们的情况下,就是用户点击两个按钮中的每个按钮。 当用户点击“ 打开”时 ,我们将向lightChanged函数发送一个真实值。 另一方面,当用户单击“关闭”按钮时,我们传递错误的值。

HomeViewController

第25行:符合协议。 我们在这里使用扩展来使代码更加井井有条,可读性强。

第25–39行:编写函数体。 我们评估布尔值确实决定了该控制器上应显示哪种背景色和文本。 就像智能家居设备接收到该消息并决定是否应打开灯一样。

Line20:请记住将委托设置为self。 这意味着HomeViewController将成为在LightControlDelegate中接受订单的员工。

包起来

委托是一种有用的通信模式,允许在给定事件发生时一个对象将消息发送到另一个对象。 定义协议的对象不需要自己处理任务; 而是将消息发送到另一个对象,并要求它处理任务。 希望您现在非常了解这种模式。 有关代表的更多信息,您可以阅读下面的文章。

进一步阅读

协议-Swift编程语言
Swift代表快速指南
Swift中的委派