在Swift中逐步实现委托。

那么,代表是什么? …在软件开发中,有通用的可重用解决方案体系结构可帮助解决给定上下文中常见的问题,可以说这些“模板”被称为设计模式。

委托是一种设计模式,当特定事件发生时,该模式允许一个对象向另一个对象发送消息。

想象一下,对象A调用对象B来执行操作。 一旦动作完成,对象A应该知道B已完成任务并采取必要的动作,这可以在代表的帮助下实现!

为了获得更好的解释,我将向您展示如何创建一个自定义委托,该委托在简单的应用程序中使用Swift在类之间传递数据,首先下载或克隆此启动程序并运行它!

您可以看到一个包含两个类的应用程序,即ViewController A和ViewControllerB。B有两个视图,这些视图可以在点击时更改ViewController的背景颜色,没有什么太复杂了吧? 好了,现在让我们以一种简单的方式来考虑,当点击B类的视图时,它也可以更改A类的背景颜色。

问题在于该视图是B类的一部分,对A类不了解,因此我们需要找到一种在这两个类之间进行通信的方法,这就是授权的亮点。

我将实现分为6个步骤,因此您可以在需要时将其用作备忘单。

步骤1:在ClassBVC文件中寻找实用标记步骤1,并添加此

//MARK: step 1 Add Protocol here.
protocol ClassBVCDelegate: class {
func changeBackgroundColor(_ color: UIColor?)
}

第一步是创建一个协议,在这种情况下,我们将在B类中创建该协议,在该协议内,您可以根据实现的要求创建任意数量的函数。 在这种情况下,我们只有一个简单的函数,它接受可选的UIColor作为参数。

命名协议的一种好习惯是在类名的末尾添加代理人一词,在本例中为ClassBVCDelegate。

步骤2:在ClassVBC中寻找步骤2的实用标记并将其添加

//MARK: step 2 Create a delegate property here.
weak var delegate: ClassBVCDelegate?

在这里,我们只为类创建一个委托属性,该属性必须采用协议类型,并且应该是可选的。 另外,您应该在属性之前添加weak关键字,以避免保留周期和潜在的内存泄漏,如果您不知道那意味着什么现在就不用担心,只需记住添加此关键字即可。

步骤3:在ClassBVC的handleTap方法中查找步骤3的实用标记并将其添加

//MARK: step 3 Add the delegate method call here.
delegate?.changeBackgroundColor(tapGesture.view?.backgroundColor)

您应该知道的一件事,运行该应用程序并点击任意视图,您将看不到任何新行为,这是正确的,但是我想指出的是,调用委托时该应用程序不会崩溃,并且这是因为我们将其创建为可选值,因此即使委托不存在它也不会崩溃。 现在,让我们转到ClassAVC文件并进行委托。

第4步:在ClassAVC的handleTap方法中查找第4步的实用标记,然后将其添加到您的类类型旁边,如下所示。

//MARK: step 4 conform the protocol here.
class ClassAVC: UIViewController, ClassBVCDelegate {

现在,ClassAVC采用了ClassBVCDelegate协议,您可以看到编译器给您一个错误,指出“ Type’ClassAVC不符合协议’ClassBVCDelegate”,这仅意味着您尚未使用协议的方法,请想象当A类采用该协议时,就像与B类签订合同,并且该合同说:“任何采用我的类都必须使用我的功能!”

快速说明:如果您来自Objective-C背景,您可能会想也可以关闭使该方法成为可选方法的错误,但是令我惊讶的是,也许您是您的,Swift语言不支持可选协议。为此,您可以为协议创建扩展名或在协议实现中使用@objc关键字。 就个人而言,如果我必须使用不同的可选方法来创建协议,则我希望将其分解为不同的协议,这样一来,我将遵循为对象赋予单一责任的概念,但是它可以根据特定的实现而有所不同。

这是一篇关于可选方法的好文章。

步骤5:在“准备缝制”方法中查找步骤5的实用标记并将其添加

//MARK: step 5 create a reference of Class B and bind them through the prepareforsegue method.
if let nav = segue.destination as? UINavigationController, let classBVC = nav.topViewController as? ClassBVC {
classBVC.delegate = self
}

在这里,我们只是创建ClassBVC的一个实例,并将其委托分配给self,但是self在这里是什么? 好吧,self是已委派的ClassAVC!

第6步:最后,在ClassAVC中寻找实用的第6步,让我们使用协议的功能,开始输入func changeBackgroundColor,您会看到它正在为您自动完成。 您可以在其中添加任何实现,在此示例中,我们只需更改背景色,然后添加即可。

//MARK: step 6 finally use the method of the contract
func changeBackgroundColor(_ color: UIColor?) {
view.backgroundColor = color
}

现在运行该应用程序!

委托无处不在,您甚至可能在没有通知的情况下使用它们,如果您过去使用委托创建表视图,那么许多UIKIT类都可以围绕它们工作,并且许多其他框架也可以解决这些主要问题。

  • 避免物体紧密结合。
  • 无需子类对象即可修改行为和外观。
  • 允许将任务处理到任意对象。

恭喜,您只是实现了一个自定义委托,我知道您可能在想,为此有那么多麻烦吗? 好的,委派是一种非常重要的设计模式,它可以帮助您了解是否要成为iOS开发人员,并始终牢记对象之间具有一对一的关系。

如果您感到困惑,不用担心,我花了一些时间来了解正在发生的事情,甚至在我的iOS Bootcamp期间对于每个人来说都是一个艰难的话题。因此,请放轻松,如果您想谈论它,请找我推特。

您可以在这里找到完整的项目

和平!