手把手带你在 Swift 中应用代理(Delegate)

简介: 本文讲的是手把手带你在 Swift 中应用代理(Delegate),什么是代理呢?在软件开发中,存在许多用于解决特定场景中的普遍问题的通用方案架构,这些所谓的“模板”,常被称为设计模式。
本文讲的是手把手带你在 Swift 中应用代理(Delegate),

什么是代理呢?在软件开发中,存在许多用于解决特定场景中的普遍问题的通用方案架构,这些所谓的“模板”,常被称为设计模式。

代理就是一种设计模式,它允许某个对象在特定事件发生时,向另一个对象发送消息。

试想对象 A 调用对象 B 来执行某项操作。该操作完成后,对象 A 理应感知到对象 B 已经完成了任务以便采取后续的其它必要操作,而代理模式便能帮助我们完成这样的要求!

为了更好地理解这个概念,我将用 Swift 写一个简单地应用来向你展示如何创建一个自定义代理来在类之间传递数据,首先,下载或 clone 初始项目 并运行看看吧!

你可以看到项目中有两个类,ViewController A 和 ViewController B。B 有两个视图,被点击时会修改 ViewController 的背景颜色,没什么复杂的概念,对吧?现在我们要想一个简单办法,来让类 A 的背景颜色也随着类 B 中的视图点击变化。

问题在于,这些视图是类 B 的一部分,并不能感知到类 A,所以我们要想办法使两个类建立起联系,这便是代理大展身手的地方。

我将实现过程分为了六个步骤,当你需要实现代理时可以依此作为参考。

第一步:在 ClassBVC 文件中找到 step 1 的注释,并添加如下代码

//MARK: step 1 Add Protocol here.

protocol ClassBVCDelegate: class {

func changeBackgroundColor(_ color: UIColor?)

}

首先我们需要创建一个协议(protocol),本例中,我们将在类 B 中创建这个协议,你可以根据实际需要来向协议中添加任意数量的方法。本例只添加了一个接收可选的 UIColor 实例(optional UIColor)为参数的简单方法。

在类名末尾添加 Delegate 并将其作为你的协议的名称是一个良好的习惯,本例中就是 ClassBVCDelegate。

第二步:在 ClassBVC 文件中找到 step 2 的注释,并添加如下代码

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

这里我们仅仅是为类添加了一个 delegate 属性,该属性必须遵循对应的协议,同时其应该被定义为可选的。同时,在声明属性时添加 weak 关键字来避免循环引用以及可能出现的内存泄露,如果你现在还不了解这是什么意思,也没关系,记着要加上这个关键字即可。

第三步:在 ClassBVC 文件中的 handleTap 方法中找到 step 3 的注释,并添加如下代码

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

你需要注意一件事,如果你现在运行程序,不论你点击哪个视图都不会看到有任何新增的表现,这是正常的,我想特别说明的是,尽管此时 delegate 属性仍未被赋值,但我们访问它的时候应用并没有崩溃,这正是因为我们将其定义为了可选类型。现在让我们把视线移动到 ClassAVC 文件中,并将其实现为代理。

第四步:在 ClassAVC 文件中找到 step 4 的注释,在类的类型后添加如下代码

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

现在 ClassAVC 便遵循了 ClassBVCDelegate 协议,你会发现编译器已经给了你一个“Type ‘ClassAVC does not conform to protocol ‘ClassBVCDelegate’”的错误了,这不过是因为你还没有实现协议中所规定的方法而已,类 A 遵循该协议时就像是和类 B 签下了一纸合约,合约规定“任何遵循该协议的类都 必须 实现规定的方法!”

注意:如果你有一定的 Objective-C 开发经验,你或许认为将该协议方法标记为可选就能消除这个错误了,但出乎我意料的是(或许你也感到惊讶),Swift 中并没有可选协议方法的概念。

第五步:在 prepare for segue 方法中找到 step 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 赋值给其 delegate 属性,self 是什么呢?self 就是实现了代理协议的 ClassAVC 实例!

第六步:最终,在 ClassAVC 中找到 step 6 的注释,实现协议中的方法。当你着手输入 func changeBackgroundColor 的时候,会发现编译器会出现相应的自动补全。在方法中你可以添加对应的实现,而本例中,我们仅仅是改变背景颜色,因此添加如下代码。

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

现在,运行程序吧!

代理无处不在,你或许正在使用却毫无察觉,如果你曾经使用过 table view,那么你就用过代理模式,许多 UIKIT 和各种框架中的类都围绕着代理做文章,而代理主要解决了以下几个问题。

  • 避免了对象之间的强耦合。
  • 无需继承便可改变对象的行为和外观。
  • 使任务可以交付给任意对象。(译者注:即抽象,无需依赖于具体类型)

恭喜,你刚刚动手实现了一个自定义代理,我知道或许此时你想着的是,这么大费周折就为了实现这点事情?呃,如果你想成为一个 iOS 开发者,那么理解代理这种设计模式至关重要,你要时刻记住,代理模式中对象之间总是一对一关系。

如果你感到疑惑也不必担心,我也花了好些时间才弄明白其中的含义,这甚至是我在上 iOS 培训课时候的重点课题。所以放轻松,慢慢来,如果你想和我讨论讨论,欢迎来 Twitter 找我。

你可以在 这里 找到项目的完整代码。

感谢阅读!





原文发布时间为:2017年2月12日

本文来自云栖社区合作伙伴掘金,了解相关信息可以关注掘金网站。
目录
相关文章
|
3月前
|
监控 Swift iOS开发
局域网计算机监控软件中利用Swift构建iOS端的移动监控应用
在局域网计算机监控软件的开发中,构建iOS端的移动监控应用是一项关键任务。本文将介绍如何利用Swift语言实现这一目标,通过多个代码示例展示关键功能的实现。
225 1
|
5月前
|
JavaScript 前端开发 PHP
用swift开发ios移动端app应用初体验
直接跟着 apple 官方的 SwiftUI 教程跑的,写惯了 javascript 奔放的代码,很多语法理解起来还是有点费劲
58 1
|
存储 前端开发 中间件
使用 Swift 搭建一个 HTTP 代理
我将通过这篇文章详述一下如何用 Swift 搭建一个 HTTP 代理服务器。本文将使用 Hummingbird 作为服务端的基本HTTP框架,以及使用 AsyncHTTPClient 作为 Swift 的 HTTP 客户端来请求目标服务。
213 0
|
编解码 Swift iOS开发
iOS 应用之间的跳转(OC&Swift)
iOS 应用之间的跳转(OC&Swift)
793 0
iOS 应用之间的跳转(OC&Swift)
|
Swift iOS开发
在Xocde12上开发面向低于iOS13的Swift应用
1、创建项目 在Xocde12上我们创建swift项目的时候Interface有两种选择:SwiftUI 和 Storyboard。其中SwiftUI只支持iOS13以上的系统,所以如果需要面向iOS13以下系统则无法使用。那么只能使用Storyboard,LifeCycle使用UIKit App Delegate。但是Xocde12默认为我们创建的项目
402 0
|
Swift iOS开发 开发者
第一个受到关注的Swift应用?“Flappy Swift”分享与简析
距离苹果公司刚刚在WWDC 2014上,发布新一代苹果平台编程语言Swift刚刚过去个11小时,开发者Nate Murray就放出了基于测试版Swift开发的应用——一个重制Flappy Bird的简易原型。
112 0
第一个受到关注的Swift应用?“Flappy Swift”分享与简析
|
Swift
Swift专题讲解十六——ARC在Swift中的应用(二)
Swift专题讲解十六——ARC在Swift中的应用
135 0
Swift专题讲解十六——ARC在Swift中的应用(二)
|
Swift iOS开发 开发者
Swift专题讲解十六——ARC在Swift中的应用(一)
Swift专题讲解十六——ARC在Swift中的应用
122 0
|
Swift iOS开发
swift4 代理的写法
简单记录swift中的代理的写法。首先在storyboard中画出两个VC: image.png 然后,把对应的类文件添加上 // // ViewController.
1680 0

相关课程

更多