闭包

闭包的介绍

  • 闭包和OC中的block非常相似

    • OC中的block是匿名的函数
    • Swift中的闭包是一个特殊的函数
    • block和闭包都经常用于回调
  • 注意:闭包和block一样,第一次使用时可能不习惯它的语法,可以先按照使用简单的闭包,随着学习的深入,慢慢掌握其灵活的运用方法.

闭包的使用

block的用法回顾
  • 定义网络请求的类
@interface HttpTool : NSObject
- (void)loadRequest:(void (^)())callBackBlock;
@end @implementation HttpTool
- (void)loadRequest:(void (^)())callBackBlock
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"加载网络数据:%@", [NSThread currentThread]); dispatch_async(dispatch_get_main_queue(), ^{
callBackBlock();
});
});
}
@end
  • 进行网络请求,请求到数据后利用block进行回调
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self.httpTool loadRequest:^{
NSLog(@"主线程中,将数据回调.%@", [NSThread currentThread]);
self.view.backgroundColor = [UIColor redColor];
}];
}
  • block写法总结:
block的写法:
类型:
返回值(^block的名称)(block的参数) 值:
^(参数列表) {
// 执行的代码
};

注意:在上述oc中的block中,在block语句块中设置self.view.backgroundColor = [UIColor redColor];不会产生循环引用,原因是,如图所示:

控制器中属性定义HttpTool,则控制器会对
HttpTool有一个强引用,在block语句块中会对外部引用的变量产生一个强引用,所以block对控制器有一个强引用,但HttpTool不会对block产生一个强引用,所以没有形成闭环,不会产生循环引用。若是解决循环引用可以用:__weak typeof(self) weakSelf = self;typeof(self)意思是取self的类型,所以也可以:__weak vc *weakSelf = self。
import UIKit

class ViewController: UIViewController {

    // 1:使用类时不需要导入类的头文件,默认自己创建的类在同一个命名空间中,且属性定义一个类的时候,必须要有初始化时,要么在定义时初始化,要么在初始化方法中进行初始化
var httpTool : HttpTool = HttpTool() override func viewDidLoad() {
super.viewDidLoad()
} func btnClick() {
print("btnClick")
} //2:重写系统的方法必须加上override关键字
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { // 闭包的常规写法
// httpTool.loadData { () -> () in
// print("加载数据完成,更新界面:", NSThread.currentThread())
// } // 闭包的简写:如果闭包是没有参数,并且没有返回值,那么闭包中 () -> () in 可以省略
// 开发中建议该写法 //3:闭包的循环引用:!相当于如果weakSelf不为空,则执行后面的代码,若为空值则不去执行后面设置背景色的代码 // 解决方案一:
// weak var weakSelf = self
//
// httpTool.loadData {
// print("加载数据完成,更新界面:", NSThread.currentThread())
// weakSelf!.view.backgroundColor = UIColor.redColor()
// } // 解决方案二:
// weak var weakSelf = self // httpTool.loadData {[weak self] () -> () in
// print("加载数据完成,更新界面:", NSThread.currentThread())
// self!.view.backgroundColor = UIColor.redColor()
// } // 解决方案三:
// unowned关键字相当于__unsafe_unretained,指向一个内存地址,不管该对象是否被销毁.依然指向该内存地址
httpTool.loadData {[unowned self] () -> () in
print("加载数据完成,更新界面:", Thread.current)
self.view.backgroundColor = UIColor.red
}
} // 4:析构函数(相当于OC中dealloc方法)
deinit {
print("ViewController----deinit")
}
}


swift学习第十五天:闭包的更多相关文章

  1. Swift学习笔记十五

    自动引用计数(Automatic Reference Counting) 和OC一样,Swift用自动引用计数机制来跟踪和管理你应用程序的内存,大多数情况下,你不需要考虑自己管理内存,Swift会自动 ...

  2. Swift学习之十四:闭包(Closures)

    * 闭包(Closures) * 闭包是自包含的功能代码块,可以在代码中使用或者用来作为参数传值. * 在Swift中的闭包与C.OC中的blocks和其它编程语言(如Python)中的lambdas ...

  3. Swift 学习笔记十五:扩展

    扩展就是向一个已有的类.结构体或枚举类型加入新功能(functionality).扩展和 Objective-C 中的分类(categories)相似.(只是与Objective-C不同的是,Swif ...

  4. python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  5. 201671010140. 2016-2017-2 《Java程序设计》java学习第十五周

    java学习第十五周 Java的GUI界面设计,框架以及主要部件填充,归置,布局管理,在第十一章和第十二章进行了系统的学习,在这两章的知识奠基下,可以简单的构造一个GUI用户界面,在两周的学习后,可以 ...

  6. 学习笔记:CentOS7学习之十五: RAID磁盘阵列的原理与搭建

    目录 学习笔记:CentOS7学习之十五: RAID磁盘阵列的原理与搭建 14.1 RAID概念 14.1.1 RAID几种常见的类型 14.1.2 RAID-0工作原理 14.1.3 RAID-1工 ...

  7. 风炫安全WEB安全学习第二十五节课 利用XSS键盘记录

    风炫安全WEB安全学习第二十五节课 利用XSS键盘记录 XSS键盘记录 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源.所以xyz.com下的js脚本采用a ...

  8. (C/C++学习笔记) 十五. 构造数据类型

    十五. 构造数据类型 ● 构造数据类型概念 Structured data types 构造数据类型 结构体(structure), 联合体/共用体 (union), 枚举类型(enumeration ...

  9. JavaScript学习总结(十六)——Javascript闭包(Closure)

    原文地址: http://www.cnblogs.com/xdp-gacl/p/3703876.html 闭包(closure)是Javascript语言的一个难点,也是它的特色, 很多高级应用都要依 ...

随机推荐

  1. jq实现回车键执行方法

    $(function(){ $(document).keypress(function (e){ if(e.keyCode == 13){ //执行你想执行的方法,keyCode代表不同的按键 } } ...

  2. HDU——T 3336 Count the string

    http://acm.hdu.edu.cn/showproblem.php?pid=3336 Time Limit: 2000/1000 MS (Java/Others)    Memory Limi ...

  3. 【MongoDB】mongodump and mongorestore of mogodb

    The another tool will be mentioned in this blog, namely mongodump and mongorestore. General speaking ...

  4. Robot Framework 自动化测试

    Robot Framework 自动化测试 RIDE 是 Robot Framework 测试数据的编辑器.它使测试用例的创建.运行.测试项目的组织可以在图形界面下完成. 通过 RIDE 去学习和使用 ...

  5. CISP/CISA 每日一题 15

    CISA 每日一题(答) 作业记帐: 监控和记录信息系统资源的使用,这些信息可被信息系统审计师用来执行: 1.将资源使用和相关用户挂钩以便实行计费: 2.通过改变系统软件的默认设置来最优化硬件性能 作 ...

  6. 洛谷 P2504 [HAOI2006]聪明的猴子

    洛谷 P2504 [HAOI2006]聪明的猴子 题目描述 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水 ...

  7. elasticsearch 源码概述

    从功能上说,可以分为两部分,分布式功能和数据功能.分布式功能主要是节点集群及集群附属功能如restful借口.集群性能检测功能等,数据功能主要是索引和搜索.代码上这些功能并不是完全独立,而是由相互交叉 ...

  8. 5.Zookeeper的两种安装和配置(Windows):单机模式与集群模式

    转自:https://blog.csdn.net/a906998248/article/details/50815031

  9. JS截取字符串 charAt(),slice(),substring(),substr()

    1. charAt(i)输出指定下标的字母,长度为1,适用于把字符串切割成单个字符串. 2. slice() 和 substring() 都支持1-2个参数,第一个参数是开始位置,第二个参数是结束位置 ...

  10. python3输出range序列

    b=range(3)         #输出的是[0, 1, 2] ,其实这里如果用在循环上,代表着循环多少次,这里是循环3次.从零开始.print(list(b))